如何在Bash中并行运行多组命令块?
实现Bash命令块内顺序执行、块间并行的方法
要让每组命令块内部按顺序执行,不同块之间并行运行,有两种实用的简单方法:
方法一:子shell后台执行
把每个命令块用括号()包裹,创建独立的子shell,再加上&将整个子shell放到后台运行。子shell内部的命令会按顺序执行,多个子shell则并行运行。最后用wait命令等待所有后台任务完成,避免脚本提前退出。
示例代码:
( echo set1 # 加-p参数避免路径不存在时报错 mkdir -p /path/to/output/set_1/ python my_script1.py /path/to/output/set_1/ ) & ( echo set2 mkdir -p /path/to/output/set_2/ python my_script2.py /path/to/output/set_2/ ) & # 等待所有后台进程执行完毕 wait
方法二:函数封装后后台调用
把每个命令块封装成函数,函数内部的命令会按顺序执行,之后后台调用这些函数即可实现块间并行。这种方式代码更整洁,适合命令块较多的场景。
示例代码:
# 封装set1的命令逻辑 run_set1() { echo set1 mkdir -p /path/to/output/set_1/ python my_script1.py /path/to/output/set_1/ } # 封装set2的命令逻辑 run_set2() { echo set2 mkdir -p /path/to/output/set_2/ python my_script2.py /path/to/output/set_2/ } # 后台启动两个函数 run_set1 & run_set2 & # 等待所有后台任务完成 wait
可选:单独记录每个块的输出
如果需要分开查看每个命令块的运行日志,可以在后台执行时添加输出重定向:
( echo set1 mkdir -p /path/to/output/set_1/ python my_script1.py /path/to/output/set_1/ ) > set1.log 2>&1 & # 将标准输出和错误输出都写入set1.log ( echo set2 mkdir -p /path/to/output/set_2/ python my_script2.py /path/to/output/set_2/ ) > set2.log 2>&1 & wait
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

