为什么要在完成后添加等待?

时间:2019-05-17 05:12:45

标签: bash job-control

我正在尝试创建一个ping清除程序,并且代码永远不会正确退出。但是,当我在完成后添加等待时,它会退出并且快得多。为什么呢?

for ip in {200..254} ; do
    ping -c 1 "192.168.16.${ip}" |grep "bytes from" |cut -d" " -f 4|cut -d":" -f1 &
done
wait

1 个答案:

答案 0 :(得分:8)

在for循环中,您通过行末的&运算符在后台运行ping作业。这样一来,便可以并行ping所有主机,而不必一一对应。

另一方面,在后台运行它们意味着在for循环结束时,所有ping进程均已生成,但尚未完成。如果没有wait,将没有更多的语句要执行,脚本将退出,并且这些ping过程最终将以orphan processes结束。这些将由您的init进程(pid 1)拾取,他们将成为新的父进程。

如果将wait放在for循环之后,脚本将等待所有子进程完成并获得其退出状态。这是干净,高效的,应该使用。


PS:您在管道中多次使用UNIX过滤器grepcut

ping ... | grep "bytes from" | cut -d" " -f 4 | cut -d":" -f1 &

考虑改用awk,这样可以一次执行这些操作:

ping ... | awk '/bytes from/{print $4}' &