Контекст:
Користувачі надають мені власні сценарії для запуску. Ці сценарії можуть бути будь-якого типу, як скрипти для запуску декількох програм графічного інтерфейсу, допоміжних служб. У мене немає контролю над тим, як написані сценарії. Ці сценарії можуть бути блокувального типу, тобто виконання чекає, поки всі дочірні процеси (програми, які запускаються послідовно), вийдуть
#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
. Це буде працювати?