我想杀死系统上除 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?
至少在 Linux 上,
kill -- -1
Run Code Online (Sandbox Code Playgroud)
将向每个进程发送 SIGTERM 信号,除了调用进程(因此运行该kill命令的进程可能是 shell,如果kill内置在那里(通常在 POSIX shell 上)或运行独立kill命令的进程)和pid 1的过程。
请注意,它是作为一部分kill()系统调用,因此它比使用类似的命令更可靠pkill或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
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应该可以在每个系统上杀死大多数进程,但是免于杀死的进程列表可能因系统而异。