Как правильно опросить существование фонового сценария

У меня проблема со сценарием следующего типа:

#!/bin/sh long_running_script.sh & while [ `pidof long_running_script.sh` ] do echo "." sleep 1 done 

В sript будет запущен новый сценарий для фона, и он должен печатать точки до тех пор, пока скрипт backgroud не выйдет. Он работает, когда загрузка процессора невысока.

Но при высокой загрузке процессора это не сработает: long_running_script.sh запустится, но сценарий «parent» выйдет из цикла while до выхода long_running_script.sh.

Кажется, что pidof выполняется до того, как long_running_script.sh действительно запущен (выполнен).

Каков наилучший способ решить эту проблему?

1 секунда сна до того, как заявление не помогло. Поэтому я не хочу использовать магические задержки, потому что это может быть ненадежным.

pidof не найдет скрипты, так как он смотрит только на первую часть имени процесса ( argv[0] ).

Вы можете использовать pidof -m , но он найдет любой long_running_script.sh , а не только тот, который запускается этим скриптом.

Лучше всего использовать $! переменная, которая содержит PID самого последнего фонового задания.

 #!/bin/bash long_running_script.sh & pid=$! while ps -p $pid >/dev/null do echo "." sleep 1 done 

Вместо этого используйте wait :

 #!/bin/sh long_running_script.sh & wait echo "done" 

Подробнее .

В случае, если вы не хотите wait блокировки, я бы справился с этой проблемой с встроенной функцией управления работой bash. Только для одного разветвленного и выполненного процесса это очень просто, и мой подход выглядит так

 #!/bin/sh sleep 1 & while jobs | grep -q "Running" ; do echo -n "." # no trailing newline sleep 0.1 done echo