如何殺死 PID 1 之外的所有進程?

如何殺死 PID 1 之外的所有進程?

我想終止系統上除 PID 1 之外的所有進程。

我目前正在使用pgrep -l . | awk "{if (\$1 != 1) print \$1}" | xargs -n 1 kill -s INT.

awk用於排除PID為1的進程

如果我在 alpine linux(使用 )上執行命令sh,我會得到:

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

我相信PID 256是來自awk.

是否有一種乾淨的方法(使用大多數 Linux 系統上可用的實用程式)來終止除 之外的所有進程PID 1

答案1

至少在 Linux 上,

kill -- -1

將向除呼叫進程之外的每個進程發送 SIGTERM 訊號(因此運行該kill命令的進程可能是kill內建的 shell(通常位於 POSIX shell 上)或運行獨立kill命令的進程)並且pid 1 的進程。

請注意,它作為kill()系統呼叫的一部分執行此操作,因此它比使用諸如pkillor killall(或killall有時killall5在Linux 上傳統上使用的傳統命令)之類的命令更可靠,這些命令首先列出進程,然後殺死它們,因為它們會錯過同時產生的進程。

所以這聽起來正是你想要的。

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

應該殺死除 id 1 的進程之外的所有內容。

您可以透過執行以下命令來進行實驗:

unshare --mount-proc -mpf

這會在單獨的 pid 和掛載命名空間(使用新的 /proc (由ps//使用))中啟動一個 shell,其中該 shell 的 pid 為 1 pkillkillall

在 Linux 之外,kill -- -1應該適用於殺死大多數進程的每個系統,但免於殺死的進程清單可能會因係統而異。

答案2

你?是的。 應該你?幾乎在所有情況下,都不會。但:

init明確忽略 Linux 上的 SIGTERM。所以你可以簡單地這樣做killall -TERM '*'

相關內容