Заставить команду Linux "Wait" ждать ВСЕ дочерние процессы - PullRequest
7 голосов
/ 18 февраля 2010

Ожидание не ожидает остановки всех дочерних процессов. Это мой сценарий:

#!/bin/bash

titlename=`echo "$@"|sed 's/\..\{3\}$//'`
screen -X title "$titlename"

/usr/lib/process.bash -verbose $@

wait

bash -c "mail.bash $@"
screen -X title "$titlename.Done"

У меня нет доступа к / usr / lib / process.bash , но это часто меняющийся скрипт, поэтому я бы хотел сослаться на него ... но в этом скрипте:

#!/bin/ksh
#lots of random stuff
/usr/lib/runall $path $auto $params > /dev/null 2>&1&

Моя проблема в том, что runall создает файл журнала ... и mail.bash предполагает отправить мне этот файл по почте, но ожидание не ждет runall до конца, похоже, он ожидает только process.bash до конца. Есть ли в любом случае, без доступа к process.bash или попытки сохранить мою собственную актуальную версию process.bash , чтобы заставить ожидание правильно ждать runall до конца? (Файл журнала перезаписывает предыдущий запуск, поэтому я не могу просто проверить наличие файла журнала, так как он всегда есть)

Спасибо, Dan

Ответы [ 4 ]

8 голосов
/ 18 февраля 2010
(
    . /usr/lib/process.bash -verbose $@
    wait
)

Вместо того, чтобы позволить ОС запускаться process.bash, это создает подоболочку, запускает все команды в process.bash, как если бы они были введены в наш сценарий оболочки, и ожидает внутри этой подоболочки.

Есть несколько предостережений, но это должно сработать, если вы не делаете ничего необычного.

4 голосов
/ 18 февраля 2010

wait ждет только прямых детей;если какие-либо дети порождают своих собственных детей, они не будут ждать их.

2 голосов
/ 18 февраля 2010

Основная проблема заключается в том, что из-за выхода process.bash процесс runall будет потерян и принадлежит init (PID 1).Если вы посмотрите на список процессов, runall больше не будет иметь никакого видимого соединения с вашим процессом, так как промежуточный сценарий process.bash завершился.Нет способа использовать ps --ppid или что-либо подобное для поиска этого процесса «внука», когда он осиротел.

Вы можете wait на конкретном PID.Вы знаете PID процесса runall?Если есть только один такой процесс, вы можете попробовать это, который будет ожидать всех запущенных runall s:

wait `pidof runall`
1 голос
/ 19 февраля 2010

Вы можете восстановить PID процесса, которого вы хотите ждать

А затем передать этот PID в качестве аргумента команде Wait

...