如何使用bash等待所有服务并行运行?

时间:2013-07-25 09:22:07

标签: linux bash parallel-processing netcat

我有一个脚本可以在4000-4004端口上启动5个服务。 我想要阻止该脚本,直到所有脚本都启动。 以下为我工作。

while ! nc -vz localhost 4000; do sleep 1; done
while ! nc -vz localhost 4001; do sleep 1; done
while ! nc -vz localhost 4002; do sleep 1; done
while ! nc -vz localhost 4003; do sleep 1; done
while ! nc -vz localhost 4004; do sleep 1; done

上面唯一的问题是,如果4002仍未启动,它将继续等待它,而我没有关于4003&的信息。 4004。

我想做的是以某种方式并行运行所有这些并打印出每个端口的状态。并且只有当它们全部启动时,它才会在该块之后继续,否则它会阻塞并打印出上下端口。

(可选地,我也需要添加一些超时,但是一旦我知道如何执行上述操作,这应该是可行的。)

非常感谢。

编辑:

以下为我效劳:

$ parallel --timeout 300 -j0 'while ! nc -vz localhost {}; do sleep 10; done; echo {} is open' ::: {4000..4004} 5001 || { echo "One or more serves failed to start. Exiting.."; exit 1; }

注意:确保在安装后运行以下命令。 ref-link

$ sudo rm /etc/parallel/config

2 个答案:

答案 0 :(得分:2)

是的,评论者是对的,在后台做。但是你必须隐含地等待背景:

while ! nc -vz localhost 4000; do sleep 1; done & pid1=$!
while ! nc -vz localhost 4001; do sleep 1; done & pid2=$!
while ! nc -vz localhost 4002; do sleep 1; done & pid3=$!
while ! nc -vz localhost 4003; do sleep 1; done & pid4=$!
while ! nc -vz localhost 4004; do sleep 1; done & pid5=$!
wait $pid1
wait $pid2
wait $pid3
wait $pid4
wait $pid5

这样,所有五个进程在后台并行启动,然后几乎立即启动第一个wait。这个等待直到第一个后台进程完成,然后第二个wait开始;可能这不需要等待很长时间,因为第二个后台进程可能会在第一个进程的同时完成。

因此,从理论上讲,这将需要与五个过程中最长的过程一样长。

答案 1 :(得分:1)

使用GNU Parallel,您可以:

parallel --timeout 30 -j0 'while ! nc -vz localhost {}; do sleep 1; done; echo {} is open' ::: {4000..4004}

10秒安装:

wget -O - pi.dk/3 | sh

观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1