我想在一个 bash 文件中运行多并行任务,如下面的示例代码,
for i in 1 2 3 4 5 6 7 8; do
setsid python /tmp/t.py ${i} 1>>/tmp/1.log 2>&1 &
done
wait # first wait
echo "next wait"
for i in 9 10 11 12 13 14 15 16; do
setsid python /tmp/t.py ${i} 1>>/tmp/1.log 2>&1 &
done
wait # second wait
如您所见,wait
可以这样做吗?我想先运行前 8 个任务,然后wait
完成所有任务,然后生成接下来的 8 个任务,因为 RAM 有限,我无法在一轮中运行所有 16 个任务。
答案1
使用选项-w
或,--wait
以便setsid
setsid 命令等待 python 进程结束后再结束自身。这意味着 shellwait
命令现在有子进程需要等待。
答案2
像这样:
set -a pids
for i in {1..8}
do
python /tmp/t.py ${i} 1>>/tmp/1.log 2>&1 &
pids[${#pids[*]}]=$! # Remember pid of child
done
# Wait for each child. This loops exits when all children are finished
for pid in ${pids[*]}
do
wait $pid
printf "Sensed end of %d\n" $pid
done
### Continue processing here
答案3
使用 GNU Parallel 它看起来像这样:
parallel -j8 setsid python /tmp/t.py {} ::: {1..16} > log