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