我正在尝试创建一个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
答案 0 :(得分:8)
在for循环中,您通过行末的&
运算符在后台运行ping作业。这样一来,便可以并行ping所有主机,而不必一一对应。
另一方面,在后台运行它们意味着在for循环结束时,所有ping进程均已生成,但尚未完成。如果没有wait
,将没有更多的语句要执行,脚本将退出,并且这些ping过程最终将以orphan processes结束。这些将由您的init进程(pid 1)拾取,他们将成为新的父进程。
如果将wait
放在for循环之后,脚本将等待所有子进程完成并获得其退出状态。这是干净,高效的,应该使用。
PS:您在管道中多次使用UNIX过滤器grep
和cut
:
ping ... | grep "bytes from" | cut -d" " -f 4 | cut -d":" -f1 &
考虑改用awk
,这样可以一次执行这些操作:
ping ... | awk '/bytes from/{print $4}' &