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

问题描述 投票:2回答:2

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

受到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命令之后,它包含所有任务的最高退出代码?

非常感谢提前!

bash job-scheduling exit-code slurm
2个回答
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

2
投票

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

#SBATCH stuf....

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

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

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

awk 'NR>1 {print $7}' jobs.log | sort -n | tail -1 
© www.soinside.com 2019 - 2024. All rights reserved.