You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:20:34