LINUX.ORG.RU

Как дождаться завершения всех процессов подоболочки в скрипте на BASH


0

0

Есть кусок кода для получения списка онлайновых хостов:

for ((CURR=5; $CURR <= 200; CURR++))
do
  CURR_IP="192.168.10.$CURR"

  if [[ $(ping -w 3 $CURR_IP 2> /dev/null |egrep ttl | wc -l ) -ge 1 ]]
  then
    echo $CURR_IP
  fi &
done > online_hosts

Так вот, собственно, вопрос:

Как узнать, что файл online_hosts заполнился списком хостов и все ping'и завершились?

Ответ на: комментарий от Deleted

И есть риск, что при одновременной записи в файл из нескольких процессов без блокировок, содержимое файла будет неправильным.

Плюс я бы заменил > на >> и в начале скрипта чистил файл.

Deleted
()
Ответ на: комментарий от Deleted

[quote] wait? [/quote]
Вот это то, что было нужно, спасибо!

borodun
() автор топика
Ответ на: комментарий от dimon555

[quote]может nmap?[/quote]
nmap -sP получается медленнее, и распознаёт меньше включённых машин,
а с другими опциями сканирования очень долгими получаются

PS и почему в комментах Lorcode нет...

borodun
() автор топика

Может, я чего-то не понимаю, но зачем так сложно обрабатывать stdout ping'а? Он (ping) с ненулевым exit code завершается, если пинги не прошли

dexpl ★★★★★
()
Ответ на: комментарий от Deleted

Вроде риска нету. echo $CURR_IP в данном случае превращается в один вызов write(), который в Линуксе для файла атомарен.

Хотя соглашусь, что выглядит это некрасиво и при большей длине сообщения, выводимого через echo будет мешанина.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.