启动独立的作业步骤并跟踪最高退出代码

Start independent job steps and keep track of highest exit code

我想启动许多独立任务(作业步骤)作为一项作业的一部分,并想跟踪所有这些任务的最高退出代码。

受到的启发,我目前正在做类似

的事情
#SBATCH stuf....

for i in {1..3}; do
    srun -n 1 ./myprog ${i} >& task${i}.log &
done

wait

在我的 jobs.sh 中,我 sbatch 开始我的任务。

如何定义一个变量 exitcode,在等待命令之后,它包含所有任务中最高的退出代码?

在此先致谢!

您可以将作业的 pid 存储在一个数组中并等待每个 pid,就像这样

#SBATCH stuf....

for i in {1..3}; do
    srun -n 1 ./myprog ${i} >& task${i}.log &
    pids+=($!)
done

for pid in ${pids[@]}; do
    wait $pid
    exitcode=$[$? > exitcode ? $? : exitcode]
done

echo $exitcode

在这种情况下,您可以并行使用 GNU:

#SBATCH stuf....

parallel --joblog ./jobs.log -P 3 "srun -n1 --exclusive ./myprog {} >& task{}.log " ::: {1..3}

这将 运行 srun ./mprog 三次,参数分别为 1、2 和 3,并将输出重定向到三个文件名 task1.logtask2.logtask3.log,就像您的 for-循环一样。

使用 --joblog 选项,它将进一步创建一个文件 jobs.log,其中将包含有关每个 运行 的一些信息,其中包括退出代码,在第 7 列中。您然后可以用

提取最大值
awk 'NR>1 {print }' jobs.log | sort -n | tail -1