как убить группы процессов в ловушке? - PullRequest
1 голос
/ 21 января 2020

В скрипте bash я обычно использую trap для очистки порожденных процессов:

function cleanup()
{
    jobs -l
    jobs -p | xargs -r -I {} kill -TERM {}
    jobs -l
    echo "do something after kill all jobs."
}
trap cleanup EXIT

Однако это не работает для групп процессов:

function cleanup()
{
    jobs -l
    jobs -p | xargs -r -I {} kill -TERM {}
    jobs -l
    echo "do something after kill all jobs."
}
trap cleanup EXIT
(sleep 100 | tee /tmp/sleep_test.log) | tee sleep_test2.log &
ps -ax -o pid,pgid,ppid,args | grep sleep
jobs -l
sleep 1

the jobs -p выдать ppid группы процессов (sleep 100 | tee ...) и процесс tee ... Группа процессов не может быть уничтожена, как указано выше. Это нужно сделать kill -TERM -PGID. Есть ли простой способ разрешить заданиям выводить группу процессов PGID? Или есть какая-либо команда, способная уничтожить группу процессов через PPID и обработать PID с помощью единого интерфейса?

update: kill -TERM 0 здесь не работает, так как она также уничтожает себя. Но мне все равно нужно что-то делать после того, как убить все задания.

1 Ответ

0 голосов
/ 21 января 2020

Единственный способ, который я нашел, - это непосредственное уничтожение подпроцессов.

#!/usr/bin/env bash

function cleanup()
{
    jobs -l
    for p in $(jobs -p); do
        kill $(pgrep -P $p)
    done
    jobs -l
    echo "do something after kill all jobs."
}
trap cleanup EXIT
(sleep 100 | tee /tmp/sleep_test.log) | tee sleep_test2.log &
ps -ax -o pid,pgid,ppid,args | grep sleep
jobs -l
sleep 1

Я пытался убить PGID, но у меня ничего не вышло.

...