Wie beende ich alle Prozesse außer PID 1?

Wie beende ich alle Prozesse außer PID 1?

Ich möchte alle Prozesse auf einem System außer PID 1 beenden.

Ich verwende derzeit pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT.

awkwird verwendet, um den Prozess mit PID 1 auszuschließen

Wenn ich den Befehl unter Alpine Linux ausführe (das verwendet sh), erhalte ich:

# pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT
kill: can't kill pid 265: No such process

Ich glaube, PID 256ist von awk.

Gibt es eine saubere Möglichkeit (mithilfe von Dienstprogrammen, die auf den meisten Linux-Systemen verfügbar sein sollten), alle Prozesse außer zu beenden PID 1?

Antwort1

Zumindest unter Linux

kill -- -1

Sendet das SIGTERM-Signal an jeden Prozess, mit Ausnahme des aufrufenden Prozesses (also des Prozesses, der diesen Befehl ausführt. Dies killkönnte die Shell sein, wenn killsie dort integriert ist (normalerweise ist dies bei POSIX-Shells der Fall), oder des Prozesses, der einen eigenständigen killBefehl ausführt) und des Prozesses mit PID 1.

Beachten Sie, dass dies als Teil des kill()Systemaufrufs geschieht und daher zuverlässiger ist als die Verwendung von Befehlen wie pkilloder killall(oder dem herkömmlichen killallBefehl, der manchmal killall5unter Linux zu finden ist und traditionell dafür verwendet wird), die zuerst die Prozesse auflisten und sie dann beenden, da dabei die in der Zwischenzeit gestarteten Prozesse übersehen würden.

Es klingt also genau nach dem, was Sie wollen.

trap '' TERM # ignore SIGTERM ourselves though it wouldn't be needed 
             # in most shells
kill -- -1
sleep 1 # leave processes some time to exit cleanly on SIGTERM
kill -s KILL -- -1 # removes the remaining processes or those 
                   # that have started since without giving them
                   # a chance to clean-up.
exit

Sollte alles außer dem Prozess mit der ID 1 beenden.

Sie können damit experimentieren, indem Sie Folgendes ausführen:

unshare --mount-proc -mpf

Dadurch wird eine Shell in einem separaten PID- und Mount-Namespace (mit einem neuen /proc (wie von ps/ pkill/ verwendet killall)) gestartet, wobei diese Shell die PID 1 hat.

Außerhalb von Linux kill -- -1sollte das Beenden der meisten Prozesse auf jedem System funktionieren, die Liste der Prozesse, die vom Beenden ausgenommen sind, kann jedoch von System zu System unterschiedlich sein.

Antwort2

Kanndu ja. SollenSie? unter fast allen Umständen nicht. Aber:

initignoriert SIGTERM unter Linux ausdrücklich. Sie könnten also einfach Folgendes tun killall -TERM '*':

verwandte Informationen