Shell 脚本:等待组中的任何进程完成

Shell script: Wait for any process in a group to finish

我有一个(小的)n 个脚本列表,我需要在 linux 上提交给 slurm。每个脚本做一些工作,然后将输出写入文件。当我请求 32 个内核时,每个脚本的工作部分执行速度比我请求 16 个或(更差)8 个内核时快得多;然而,对于 32 个内核,调度的等待时间通常最长,然后是 16 个,然后是 8 个。根据我无法控制的影响等待时间的条件,请求 32 个内核可能会导致总时间最短,也可能不会。

我的解决方案是提交 n*3 个作业,每个脚本一个,每个处理器数量在 {32, 16, 8} 中。对于每个脚本,我只需要一个过程来完成,我不在乎它是哪个。到目前为止,我手动检查每个进程的输出以获取已完成的证据,然后手动取消其他两个进程 运行ning 相同的脚本。我想将其自动化。

我怎样才能同时运行n组进程,等待每组中的第一个进程完成(此时,组中的其他进程应该被取消),并等待这个在继续执行脚本中的其他命令之前,所有组都会出现?

我当前提交作业的代码是:

for i in {1..9};
    do for p in 32 16 8;
        do srun -t 3:00:00 -N 1 -n 1 -c $p --mem=50g python my_script_$i.py $p > my_script_${i}_${p}.out &
        done;
    done;
wait

我查看了 wait 命令,但我不确定如何等待任何进程(而不是所有进程或特定进程)完成。

我也愿意接受这样一种可能性,即有比使用 s 循环提交这些作业到 slurm 更好的方法运行--我是 slurm 初学者。

编辑: 可能相关,但我不确定如何使其并行工作。

运行 子外壳中的每个组(在后台),以便 wait -n 可以等待该组中的作业完成。

for i in {1..9}; do
  ( for p in 32 16 8; do
      srun ... & jobs+=($!)
    done
    wait -n  "${jobs[@]}" # Wait for one of the preceding 3 jobs to complete
    kill "${jobs[@]}"     # Kill the other two
  ) &
done

wait  # Wait for each of the 9 groups to complete