Beenden Sie eine Gruppe von Prozessen mit negativer PID


7
kill -TERM -PID 

soll PID und alle seine untergeordneten Prozesse töten.
aber das funktioniert nicht unter openSUSE, es sagt mir immer, dass kein solcher Prozess -PID egal welche PID ich benutze.
Wenn die negative PID-Option von dieser bestimmten Version von kill nicht unterstützt wird, wie kann eine Gruppe von Prozessen am besten beendet werden?

Hintergrund:
Ich habe ein Shell-Skript ausgeführt. Innerhalb des Skripts verwende ich wget, um Dinge herunterzuladen. Das Skript ist also der übergeordnete Prozess, wget ist der untergeordnete Prozess. Ich möchte sie beide mit kill -TERM -PID_OF_SCRIPT töten


3
Zitieren des Standards : Wenn der erste PID-Operand negativ ist, sollte ihm "-" vorangestellt werden , damit er nicht als Option interpretiert wird . Die Verwendung einer negativen Zahl für das pidArgument bezieht sich auch auf die Prozessgruppen-ID .
Totor

1
Es soll nicht PID und alle seine untergeordneten Prozesse töten, es soll alle Prozesse von pgid töten PID. Verwenden Sie ps -jdiese Option, um die Prozessgruppen-IDs anzuzeigen.
Stéphane Chazelas

Antworten:


7

Sagt es "keine solche PID" oder gibt es einen Fehler - wie in funktioniert das?

kill -TERM -- -GPID

Beachten Sie auch gemäß (betonen Sie meinen)
Mann 1 :

"[…] Wenn ein Argument der Form '-n' angegeben wird und eine Prozessgruppe […] bezeichnet werden soll."

Mann 2 :

"[…] Wenn pid kleiner als -1 ist, wird sig an jeden Prozess in der Prozessgruppe gesendet, dessen ID -pid ist. […]"

Mann 3 :

"[…] Wenn pid negativ ist, aber nicht -1, wird sig an alle Prozesse gesendet (mit Ausnahme eines nicht spezifizierten Satzes von Systemprozessen), deren Prozessgruppen-ID gleich dem absoluten Wert von pid ist, […]"

Wie in, nicht PID, sondern Prozessgruppen-ID.


Sonst kannst du vielleicht so viel Spaß mit / proc / [pid] / stat haben

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

pkill -TERM -g PGRP


1
es heißt / bin / kill: -23958: Kein solcher Prozess.
Dave.d

pkill -TERM -g PGRP, das funktioniert in meinem Fall perfekt.
Dave.d

was macht kill --das
Zibri

4

Die Fehlermeldung /bin/kill: -23958: No such processkann auch auf die Tatsache zurückzuführen sein , dass die pid 23958ist kein pgid (Prozessgruppen - ID - Nummer)!

Dies kann beispielsweise der Fall sein, wenn Sie versuchen, eine Hintergrundhell ​​(oder einen Befehl) in einem Skript zu $!beenden, das fälschlicherweise als pgid verwendet wird. In einer Jobsteuerungs-fähigen Shell $!kann sie jedoch als pgid verwendet werden (siehe: Warum lebt der untergeordnete Prozess noch, nachdem der übergeordnete Prozess unter Linux beendet wurde? ).

# 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
'


2

Dies hat möglicherweise damit zu tun, dass Sie den in der Shell integrierten Kill verwenden und nicht die Binärdatei. Versuchen Sie, diese zu verwenden

/bin/kill 

Wenn es funktioniert, würde ich vorschlagen, zu überprüfen, ob Ihre Shell die Prozessgruppenfunktion einer neueren Version hinzugefügt hat. Oder verwenden Sie einfach die Binärdatei.


Ich habe darüber nachgedacht. Und ich habe versucht / bin / kill, es hat nicht geholfen.
Dave.d

1

Wenn das zugrunde liegende Betriebssystem Busybox verwendet und daher, sagt es Error: kill: bad signal name '-', ist es höchstwahrscheinlich ein Problem mit --.

Sie müssen angeben, kill -TERM -- -[gpid]anstatt nur kill -- -[gpid]. TERM ist das Standardsignal.

Ich weiß nicht warum.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.