Shell脚本:如何在并行命令结束后分别执行对应后续命令
解决并行任务结束后触发对应后续命令的Shell方案
作为Shell新手,你需要的是让每个Python命令完成后立刻执行对应的后续命令,同时保持初始的三个命令并行运行。这里有个简单且易理解的实现方式:
核心思路:子shell后台执行任务组
把每组「command_XA → 等待结束 → command_XB」打包成一个子shell,然后让这个子shell后台运行。这样三个子shell会同时启动,各自内部的命令是顺序执行的——只有当command_XA完全结束,才会执行对应的command_XB,完全符合你的需求。
完整脚本示例
#!/bin/bash # 第一组任务:command_1A结束后自动执行command_1B ( echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动command_1A" python /path/to/your/command_1A.py # 替换为实际的command_1A命令 echo "[$(date +'%Y-%m-%d %H:%M:%S')] command_1A完成,启动command_1B" python /path/to/your/command_1B.py # 替换为实际的command_1B命令 ) & # 第二组任务 ( echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动command_2A" python /path/to/your/command_2A.py echo "[$(date +'%Y-%m-%d %H:%M:%S')] command_2A完成,启动command_2B" python /path/to/your/command_2B.py ) & # 第三组任务 ( echo "[$(date +'%Y-%m-%d %H:%M:%S')] 启动command_3A" python /path/to/your/command_3A.py echo "[$(date +'%Y-%m-%d %H:%M:%S')] command_3A完成,启动command_3B" python /path/to/your/command_3B.py ) & # 可选:等待所有后台任务全部完成后再结束脚本 wait echo "[$(date +'%Y-%m-%d %H:%M:%S')] 所有任务执行完毕"
关键细节解释
- 子shell:用
()包裹的命令会在独立的子shell中执行,内部的命令是顺序执行的——只有前一条命令退出,才会执行下一条。 - 后台运行:每个子shell末尾的
&会让它在后台启动,三个子shell同时运行,所以初始的三个command_XA是并行执行的。 - wait命令:脚本末尾的
wait会等待所有后台进程结束后再退出脚本,如果不需要等待全部任务完成,可以去掉这一行。
进阶:处理命令失败的情况
如果需要在command_XA执行失败时跳过对应的command_XB,可以在子shell中加入状态判断:
( echo "启动command_1A" python command_1A.py # 检查上一条命令的退出状态(0为成功,非0为失败) if [ $? -eq 0 ]; then echo "command_1A成功,启动command_1B" python command_1B.py else echo "command_1A执行失败,跳过command_1B" fi ) &
这个方案不需要手动管理进程ID,逻辑清晰,非常适合Shell新手快速实现需求。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

