Как уничтожить все подпроцессы оболочки?

Я пишу сценарий удара, который делает несколько вещей.

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

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

Так, это могло бы быть похожим на это:

#!/bin/bash

some_monitor1.sh &
some_monitor2.sh &
some_monitor3.sh &

do_some_work
...

kill_subprocesses

Вещь состоит в том, что большинство этих мониторов порождает свои собственные подпроцессы, таким образом делая (например): killall some_monitor1.sh будет не всегда помогать.

Какой-либо другой способ обработать эту ситуацию?

37
задан codeforester 24 March 2018 в 05:20
поделиться

4 ответа

После запуска каждого дочернего процесса вы можете получить его идентификатор с помощью

ID=$!

. Затем вы можете использовать сохраненные идентификаторы PID для поиска и уничтожения всех дочерних процессов и т. Д. Как описано здесь или здесь .

27
ответ дан 27 November 2019 в 04:02
поделиться

Если вы используете отрицательный PID с kill , он уничтожит группу процессов. Пример:

kill - -1234

15
ответ дан 27 November 2019 в 04:02
поделиться
kill $(jobs -p)

Предложение Риса Улериха:

Оговорка о состоянии гонки, используя [код ниже] достигает того, что предложил Юрген, не вызывая ошибки, когда нет заданий

[[ -z "$(jobs -p)" ]] || kill $(jobs -p)
9
ответ дан 27 November 2019 в 04:02
поделиться

pkill с optioin "-P" должен помочь:

pkill -P $(pgrep some_monitor1.sh)

со страницы руководства:

   -P ppid,...
          Only match processes whose parent process ID is listed.

На linuxquests.org есть некоторые обсуждения, пожалуйста, проверьте:

http://www.linuxquestions.org/questions/ Programming-9 / use-only-one-kill-to-kill-Father-and-child -cesses-665753 /

3
ответ дан 27 November 2019 в 04:02
поделиться