我想作为一项工作的一部分开始许多独立的任务(工作步骤),并希望跟踪所有这些任务的最高退出代码。
受this question的启发,我目前正在做类似的事情
#SBATCH stuf....
for i in {1..3}; do
srun -n 1 ./myprog ${i} >& task${i}.log &
done
wait
在我的jobs.sh
sbatch
中开始执行任务。
如何定义变量exitcode
,该变量在等待命令之后包含所有任务中最高的退出代码?
非常感谢!
答案 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.log
,task2.log
和task3.log
,就像您的for
循环就可以了。
使用--joblog
选项,它将进一步创建文件jobs.log
,该文件将包含有关每次运行的一些信息,其中包括第7列中的退出代码。
awk 'NR>1 {print $7}' jobs.log | sort -n | tail -1