mata um grupo de processos com PID negativo

5
kill -TERM -PID 

deve matar o PID e todos os seus processos filhos.
mas isso não funciona no openSUSE, sempre me diz que não há esse processo - PID, não importa o PID que eu uso. Portanto, se a opção PID negativa não for suportada por essa versão específica de kill, qual é a melhor maneira de eliminar um grupo de processos?

fundo:
Eu tenho um script de shell em execução. dentro do script, eu uso o wget para baixar as coisas. Portanto, o script é o processo pai, wget é o processo filho. Eu quero matar os dois usando kill -TERM -PID_OF_SCRIPT

    
por David Dai 22.03.2013 / 02:10

5 respostas

7

Diz "nenhum tal PID" ou há um erro, como este trabalho?

kill -TERM -- -GPID

Observe também, conforme (enfatize o meu) man 1 :

"[…] When an argument of the form '-n' is given, and it is meant to denote a process group […]"

homem 2 :

"[…] If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid. […]"

homem 3 :

"[…] If pid is negative, but not -1, sig shall be sent to all processes (excluding an unspecified set of system processes) whose process group ID is equal to the absolute value of pid, […]"

Como em, não PID, mas ID do grupo de processos.

Talvez você possa se divertir tanto com / proc / [pid] / stat

ppid: awk '{gsub(/\([^)]+\)/,"_"); print $4}' /proc/3955/stat
pgrp: awk '{gsub(/\([^)]+\)/,"_"); print $5}' /proc/3955/stat

pkill -TERM -g PGRP

    
por 22.03.2013 / 04:23
4

A mensagem de erro /bin/kill: -23958: No such process também pode ser devida ao fato de que o pid 23958 é no pgid (número de identificação do grupo de processos)!

Isso pode, por exemplo, ser o caso se você tentar matar um shell em segundo plano (ou comando) em um script por engano usando $! como pgid; em um shell habilitado para controle de trabalho, no entanto, $! pode ser usado como um pgid (consulte: Por que o processo filho ainda está ativo depois que o processo pai foi morto no Linux? ).

# examples of how to kill a process group
# (using sh -c '...' instead of a shell script)

# kill: -<num>: No such process
sh -c '
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'

# in Terminal.app 
# job control is enabled by default
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!


# enable job control
sh -c '
set -m 
(sleep 200 & sleep 200 & sleep 200) &
/bin/kill -s TERM -$!
'

# make sure pid == pgid
# note that the script gets killed as well
sh -c '
echo pid $$
trap "trap - EXIT; echo pid $$ was killed" EXIT
(sleep 200 & sleep 200 & sleep 200) &
IFS=" " read -r pgid <<EOF
$(ps -p $! -o pgid=)
EOF
sleep 5
/bin/kill -s TERM -${pgid}
sleep 5
echo pid $$ was not killed
'

# use a pseudo-terminal (pty) to avoid killing the script
# note the use of -$$ instead of -$!
sh -c '
echo pid $$
script -q /dev/null sh -c '\''
trap "" HUP
(sleep 200 & sleep 200 & sleep 200) &
sleep 5
/bin/kill -s TERM -$$
'\''
sleep 5
echo pid $$ was not killed
'
    
por 20.02.2014 / 16:28
2

Você pode usar a solução "pkill" ou "killtree", mostrada neste encadeamento em outros sites do StackExchange:)

link

pkill -TERM -P PARENT_PID
    
por 22.03.2013 / 03:36
1

Isso pode ter a ver com você usando o kill embutido do shell e não o binário, tente usar

/bin/kill 

Se funcionar, sugiro verificar se o seu shell adicionou o recurso de grupo de processos a uma versão mais recente. Ou apenas use o binário.

    
por 22.03.2013 / 06:44
1

se o sistema operacional subjacente usa o Busybox e, portanto, diz Error: kill: bad signal name '-' , provavelmente é um problema com -- .

Você precisa especificar kill -TERM -- -[gpid] em vez de apenas kill -- -[gpid] . TERM é o sinal padrão.

Eu não sei porque.

Espero que isso ajude alguém.

    
por 15.09.2017 / 01:58