开始独立的工作步骤并跟踪最高退出代码

时间:2018-09-03 15:52:13

标签: bash job-scheduling exit-code slurm

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

this question的启发,我目前正在做类似的事情

#SBATCH stuf....

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

wait

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

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

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以将作业的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

答案 1 :(得分:2)

在这种情况下,您可以并行使用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 $7}' jobs.log | sort -n | tail -1