【问题标题】:Why should I add wait after done?为什么我要在完成后添加等待?
【发布时间】:2019-05-17 05:12:45
【问题描述】:

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

【问题讨论】:

标签: bash job-control


【解决方案1】:

在您的 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}' &

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2017-07-16
    • 2020-06-08
    • 2019-12-18
    • 2017-08-12
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多