Я пишу сценарий удара, который делает несколько вещей.
В начале это запускает несколько сценариев монитора, каждый из них выполняет некоторые другие инструменты.
В конце моего основного сценария я хотел бы уничтожить все вещи, которые были порождены от моей оболочки.
Так, это могло бы быть похожим на это:
#!/bin/bash
some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &
do_some_work
...
kill_subprocesses
Вещь состоит в том, что большинство этих мониторов порождает свои собственные подпроцессы, таким образом делая (например): killall some_monitor1.sh
будет не всегда помогать.
Какой-либо другой способ обработать эту ситуацию?
После запуска каждого дочернего процесса вы можете получить его идентификатор с помощью
ID=$!
. Затем вы можете использовать сохраненные идентификаторы PID для поиска и уничтожения всех дочерних процессов и т. Д. Как описано здесь или здесь .
Если вы используете отрицательный PID с kill
, он уничтожит группу процессов. Пример:
kill - -1234
kill $(jobs -p)
Оговорка о состоянии гонки, используя [код ниже] достигает того, что предложил Юрген, не вызывая ошибки, когда нет заданий
[[ -z "$(jobs -p)" ]] || kill $(jobs -p)
pkill с optioin "-P" должен помочь:
pkill -P $(pgrep some_monitor1.sh)
со страницы руководства:
-P ppid,...
Only match processes whose parent process ID is listed.
На linuxquests.org есть некоторые обсуждения, пожалуйста, проверьте: