【发布时间】:2022-01-09 12:14:55
【问题描述】:
我想在 bash 脚本的 while 循环中启动一系列后台作业:
END=10
i=0;
while [ $i -lt $END ]
do
(SOME COMMAND;\
sleep 3;
SOME COMMAND 1;\
SOME COMMAND 2;\
SOME COMMAND 3;) &
i=`expr $i + 1`
done
在这个while循环之外,我想等到所有这10个后台作业都完成SOME COMMAND 1然后继续,所以伪代码类似于:
until [the number of process that finished SOME COMMAND 1 is greater or equal to $END];
do
sleep 0.5
done
我试图做的是添加另一个这样的计数器:
true_started_cnt=0
END=10
i=0;
while [ $i -lt $END ]
do
(SOME COMMAND;\
sleep 3;
SOME COMMAND 1;\
true_started_cnt=`expr $true_started_cnt + 1`;\
SOME COMMAND 2;\
SOME COMMAND 3;) &
i=`expr $i + 1`
done
until [ $true_started_cnt -ge $END ]
do
echo "Waiting for initial period for all streams to finish"
sleep 0.5
done
但这似乎不起作用,可能是因为多个 bg 作业同时写入同一个全局变量。我想知道如何在这段代码中实现我的意图。
参考this post,我也在尝试:
echo 1 >/dev/shm/foo
END=10
i=0;
while [ $i -lt $END ]
do
(SOME COMMAND;\
sleep 3;
SOME COMMAND 1;\
echo $(($(</dev/shm/foo)+1)) >/dev/shm/foo;\
SOME COMMAND 2;\
SOME COMMAND 3;) &
i=`expr $i + 1`
done
until [ $(echo $(</dev/shm/foo)) -ge $END ]
do
echo "Waiting, true_started_cnt=$(echo $(</dev/shm/foo))"
sleep 1
done
但还是不行。
【问题讨论】:
-
我猜你的意思是在while循环之外添加
wait?我认为这样我正在等待整个 bg 工作完成,但我的目标是等到他们完成一个子步骤,即SOME COMMAND 1 -
修改子shell中的变量不会影响父shell变量。
-
你还需要锁定/dev/shm。在我看来,所有这些都不是必需的。您只需要记录子 PID 并检查它们是否仍然处于活动状态。