Одновременно следить за сигналами и выходом из процесса в оболочке Bourne

У меня есть оболочка Bourne (/bin/sh )сценарий (для переносимости ), который хочет контролировать другую программу. Он должен запустить другую программу, а затем дождаться ее выхода. Когда вторая программа завершает работу, она выполняет последнюю работу и завершает работу. Загвоздка в том, что скрипт должен также реагировать на сигналы (, например, USR2 ), и выполнять некоторую работу при появлении этих сигналов.

Моя наивная реализация:

#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 120 &
pid=$!
wait $pid
echo $pid exited with $?
echo Doing final cleanup

Это не работает. Если я отправлю оболочку SIGUSR2, ловушка сработает, как и ожидалось, но ожидание также завершится, вернув 140. /bin/sleep продолжит свой веселый путь. Типовой выход:

28849
Respond to USR2
28850 exited with 140
Doing final cleanup

Это поведение согласуется между dash и bash, двумя производными оболочки Bourne, к которым у меня есть удобный доступ.

Моя текущая работа заключается в том, чтобы вращать цикл, ожидая исчезновения дочернего PID, исследуя kill. Зацикливание вращения кажется расточительным и увеличивает окно, в котором мой сценарий может ошибочно ожидать не того процесса, если PID быстро используются повторно.

#! /bin/sh
echo $$
trap 'echo Respond to USR2' USR2
/bin/sleep 15 &
pid=$!
while /bin/kill -0 $pid 2> /dev/null; do
    echo waiting...
    sleep 2
done
echo Doing final cleanup

Есть ли лучшее решение, учитывая мою цель одновременного ожидания выхода другого процесса и возможности реагировать на сигналы?

8
задан Jolta 11 April 2017 в 08:00
поделиться