Выполнение команды linux "Wait" для всех дочерних процессов

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

#!/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.Баш, но это сценарий, который часто меняется, поэтому я хотел бы сослаться на него... но в этом сценарии:

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

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

спасибо, Дэн!--3-->

4 ответов


(
    . /usr/lib/process.bash -verbose $@
    wait
)

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

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


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


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

вы можете wait на определенном PID. Вы знаете PID


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

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