3

我正在尝试创建一个 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
4

1 回答 1

8

在您的 for 循环中,您正在通过&行尾的操作员在后台运行 ping 作业。这允许并行 ping 所有主机,而不是一一执行。

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

如果你把waitfor 循环之后,脚本将等待所有子进程完成并获得它们的退出状态。这是干净、高效的,应该使用。


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

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

考虑改为使用awk,它允许在一次运行中执行这些操作:

ping ... | awk '/bytes from/{print $4}' &
于 2019-05-17T05:38:57.580 回答