
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
.
awk
wird 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 256
ist 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 kill
könnte die Shell sein, wenn kill
sie dort integriert ist (normalerweise ist dies bei POSIX-Shells der Fall), oder des Prozesses, der einen eigenständigen kill
Befehl 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 pkill
oder killall
(oder dem herkömmlichen killall
Befehl, der manchmal killall5
unter 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 -- -1
sollte 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:
init
ignoriert SIGTERM unter Linux ausdrücklich. Sie könnten also einfach Folgendes tun killall -TERM '*'
: