1

我有一个脚本可以在 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; }

注意:确保在安装后运行以下命令。参考链接

$ sudo rm /etc/parallel/config
4

2 回答 2

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启动第二个;可能这不必等待很长时间,因为第二个后台进程可能与第一个后台进程大约在同一时间完成。

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

于 2013-07-25T10:30:39.400 回答
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

于 2013-07-25T10:49:15.747 回答