我正在尝试创建一个 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
我正在尝试创建一个 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
在您的 for 循环中,您正在通过&
行尾的操作员在后台运行 ping 作业。这允许并行 ping 所有主机,而不是一一执行。
另一方面,在后台运行它们意味着在 for 循环结束的那一刻,所有 ping 进程都已生成,但它们尚未完成。如果没有wait
要执行的更多语句,脚本将退出,并且那些 ping 进程将最终成为孤立进程。这些将由您的 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}' &