Я пишу сценарий bash, который запускает несколько фоновых процессов. Я хотел бы получать уведомления всякий раз, когда процесс завершается; и я хотел бы знать pid завершенного процесса.
Я рассмотрел использование wait
, так что идентификаторы каждого порожденного процесса захватываются и сохраняются в массиве, а затем массив повторяется и для каждого процесса вызывается ожидание. Этот метод описан по-разному здесь:
https://stackoverflow.com/a/356154/366856
Проблема с этим, если я правильно понимаю, заключается в том, что он может быть относительно неэффективным, если вы хотите выполнить какое-либо действие, как только отдельный процесс завершится.Например, если вы порождаете процессы A и B, а B завершается раньше A, то выполнение должно дождаться завершения как A, так и B. Мне нужно выполнить действие, как только Б. закончит.
Кажется, что trap SIGCHLD
- это способ немедленно выполнить действие, когда дочерний элемент завершается, но проблема в том, что я не могу найти способ определить pid источника сигнала SIGCHLD, который Мне тоже нужно. Наиболее близким к рабочему примеру я нашел третий пример кода в этом сообщении:
http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187
Я скопировал его сюда для удобства:
#!/bin/bash
iNext=0
function ChildReturned() {
wait $1
echo "$1 was returned. Its exits status was: $?"
iNext=$((iNext+1))
StartChild $iNext
}
function StartChild {
./child $1 &
pid=$!
echo "Started: $1 PID= $pid"
trap 'ChildReturned $pid' SIGCHLD
}
set -bm
for (( iNext=0; iNext<=10; iNext++ ));
do
StartChild $iNext
done
wait
Я думаю, что этот пример не работает, потому что автор делает ошибку, вызывая trap
несколько раз, каждый раз захватывая другой pid переменная в аргументе trap
. Каждый раз, когда вызывается ловушка, она перезаписывает предыдущий вызов, и, таким образом, будет захвачен произвольный pid. Мне не удалось найти лучшую технику.
Есть ли способ получить pid завершенного дочернего процесса с помощью ловушки в bash?
Обновление
Я просто хотел указать на этот ресурс, который содержит лучший и наиболее полный обзор решений этой проблемы. что я видел до сих пор: