Блокирующий раствор
Используйте wait
в цикле для ожидания завершения всех процессов:
function anywait()
{
for pid in "$@"
do
wait $pid
echo "Process $pid terminated"
done
echo 'All processes terminated'
}
Эта функция будет завершена немедленно после завершения всех процессов. Это наиболее эффективное решение.
Неблокирующее решение
Использовать kill -0
в цикле, для ожидания завершения всех процессов + сделать что-нибудь между проверками:
function anywait_w_status()
{
for pid in "$@"
do
while kill -0 "$pid"
do
echo "Process $pid still running..."
sleep 1
done
done
echo 'All processes terminated'
}
Время реакции уменьшилось до sleep
времени, потому что нужно предотвратить высокую загрузку ЦП.
Реалистичное использование:
Ожидание завершения всех процессов + информирование пользователя о всех работающих PID.
function anywait_w_status2()
{
while true
do
alive_pids=()
for pid in "$@"
do
kill -0 "$pid" 2>/dev/null \
&& alive_pids+="$pid "
done
if [ ${#alive_pids[@]} -eq 0 ]
then
break
fi
echo "Process(es) still running... ${alive_pids[@]}"
sleep 1
done
echo 'All processes terminated'
}
Примечания
Эти функции получают PID с помощью аргументов $@
как массив BASH.