Контекст:
Пользователи предоставляют мне свои собственные скрипты для запуска. Эти сценарии могут быть любого типа, такие как сценарии для запуска нескольких программ с графическим интерфейсом, внутренних служб. Я не контролирую, как пишутся сценарии. Эти сценарии могут быть блокирующего типа, т.е. выполнение ожидает завершения всех дочерних процессов (программ, запускаемых последовательно)
#exaple of blocking script
echo "START"
first_program
second_program
echo "DONE"
или не блокирующий тип, то есть те, которые обрабатывают дочерний процесс в фоновом режиме и выходят что-то вроде
#example of non-blocking script
echo "START"
first_program &
second_program &
echo "DONE"
Чего я пытаюсь достичь?
Предоставляемые пользователем сценарии могут быть любого из двух указанных выше типов или сочетанием обоих. Моя задача - запустить скрипт и подождать, пока все запущенные им процессы не завершатся, а затем завершить работу узла. Если это блокирующий тип, то дело простое, т.е. получите PID процесса выполнения скрипта и подождите, пока ps -ef | grep -ef PID больше не будет иметь записей. Неблокирующие скрипты доставляют мне неприятности
Есть ли способ получить список PID всех дочерних процессов, созданных при выполнении сценария? Любые указатели или подсказки будут высоко оценены
grep
, просто ps –udummy_user
. Также посмотрите на группы процессов.
ps
без аргументов (должно быть только bash
и ps
в начале). Начните свой сценарий там. После того, как он закончится, подождите, пока не ps | wc -l
достигнете ожидаемого значения.
pid$(foo.sh; echo $!)
что даст вам PID, которыйfoo.sh
вы затем сможете использоватьps --ppid
. Будет ли это работать?