如何修改Bash脚本实现多目录任务按序执行并校验终止状态?
串行执行目录任务的Bash脚本修改方案
问题描述
我需要通过Bash脚本依次执行多个目录(calculation_01、calculation_02等)中的任务:每个目录下的*.in文件需通过mpirun调用运行,执行后会生成*.out文件。当前脚本会同时启动所有任务,导致calculation_01目录下的首个任务失败,仅calculation_02目录任务正常终止。现需修改脚本逻辑,实现前一个目录任务执行完成且校验到*.out文件包含“Normal Termination”(正常终止)后,再启动下一个目录的任务,请问需修改哪行代码?
核心修改点
假设你当前的脚本核心循环是后台并行启动任务的写法,类似下面这段:
for dir in calculation_*; do (cd "$dir" && mpirun -np 4 your_program < *.in > *.out) & done wait
你需要修改的是移除任务命令末尾的&符号,并新增正常终止校验逻辑,让任务从并行执行改为串行执行,且只有上一个任务正常结束才会启动下一个。
修改后的完整核心逻辑:
for dir in calculation_*; do # 切换到目标目录,失败则跳过当前目录 if ! cd "$dir"; then echo "无法进入目录 $dir,跳过" continue fi # 串行执行任务(去掉原代码中的&) mpirun -np 4 your_program < *.in > *.out # 校验任务是否正常终止 if grep -q "Normal Termination" *.out; then echo "$dir 任务正常完成,准备执行下一个目录" cd .. else echo "$dir 任务未正常终止,脚本终止" exit 1 fi done
关键修改说明
- 移除
&:原代码中的&会让每个任务在后台启动,导致所有任务并行运行;去掉后任务会在当前Shell进程中执行,必须等当前任务结束才会进入循环的下一次迭代。 - 新增
grep校验:通过grep -q "Normal Termination" *.out静默检查输出文件是否包含正常终止标记,只有校验通过才会继续执行下一个目录的任务。
内容的提问来源于stack exchange,提问作者DaveS
相关产品推荐
相关产品推荐

