如何杀死除 PID 1 之外的所有进程?

F21*_*F21 5 process kill

我想杀死系统上除 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
Run Code Online (Sandbox Code Playgroud)

我相信PID 256是从awk.

是否有一种干净的方法(使用在大多数 Linux 系统中都应该可用的实用程序)来终止除PID 1?

Sté*_*las 6

至少在 Linux 上,

kill -- -1
Run Code Online (Sandbox Code Playgroud)

将向每个进程发送 SIGTERM 信号,除了调用进程(因此运行该kill命令的进程可能是 shell,如果kill内置在那里(通常在 POSIX shell 上)或运行独立kill命令的进程)和pid 1的过程。

请注意,它是作为一部分kill()系统调用,因此它比使用类似的命令更可靠pkillkillall(或传统的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
Run Code Online (Sandbox Code Playgroud)

应该杀死除 id 1 之外的所有进程。

您可以通过运行来试验它:

unshare --mount-proc -mpf
Run Code Online (Sandbox Code Playgroud)

启动在一个单独的PID的壳和安装件的命名空间(用新的/ proc(13759 ps/ pkill/ killall))其中该壳具有PID 1。

在 Linux 之外,kill -- -1应该可以在每个系统上杀死大多数进程,但是免于杀死的进程列表可能因系统而异。