Выполнение команды 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