我想终止系统上除 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 '*'
。