pid захвата завершенного фонового процесса с использованием ловушки в bash

Я пишу сценарий 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?

Обновление

Я просто хотел указать на этот ресурс, который содержит лучший и наиболее полный обзор решений этой проблемы. что я видел до сих пор:

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_time .

5
задан Community 23 May 2017 в 11:46
поделиться