如何杀死除 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 '*'

相关内容