
我想終止系統上除 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()
系統呼叫的一部分執行此操作,因此它比使用諸如pkill
or 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 pkill
。killall
在 Linux 之外,kill -- -1
應該適用於殺死大多數進程的每個系統,但免於殺死的進程清單可能會因係統而異。
答案2
能你?是的。 應該你?幾乎在所有情況下,都不會。但:
init
明確忽略 Linux 上的 SIGTERM。所以你可以簡單地這樣做killall -TERM '*'
。