Почему я должен добавить ожидание после того, как сделано? - PullRequest
3 голосов
/ 17 мая 2019

Я пытаюсь создать ping sweeper, и код никогда не завершается должным образом.Однако, когда я добавляю ожидание после того, как готово, оно выходит и становится намного быстрее.Почему это так?

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 Ответ

8 голосов
/ 17 мая 2019

В вашем цикле for вы запускаете задания ping в фоновом режиме с помощью оператора & в конце строки.Это позволяет пинговать все хосты параллельно вместо того, чтобы выполнять их один за другим.

С другой стороны, запуск их в фоновом режиме означает, что в момент окончания цикла for все процессы пинга были порождены, ноони еще не были закончены.Без 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}' &
...