我正在编写一个 bash 脚本,它会杀死一堆按某些标准选择的进程,然后退出。唯一的问题是这些标准适用于脚本及其父进程(bash
,sshd
)本身,因此为了避免在脚本完成工作之前杀死脚本,我首先获取与 匹配的进程ps
,然后过滤掉脚本及其父母用sed
,最后用 杀死剩余的进程kill
。
现在我想知道是否可以将其简化为单个pkill
调用,但显然只有在pkill
保证杀死自身及其父进程的情况下才能起作用最后的如果它们出现在要终止的进程列表中。
是否有这样的保证落实到pkill
?
答案1
pkill
永远不会自杀,就像pgrep
神经列出自己一样;pkill
做出口杀死每个符合条件的进程(除了它自己)之后。pkill
如果它符合条件,就会杀死它的父级,但是如果父级是 shell,除非您使用不可忽略的信号(通常只有 -9 又名 -[SIG]KILL),否则 shell 通常会忽略它。如果它包含你的sshd
,确实会杀死你的会话,以及你的 shell 和(大多数?)其他进程,这通常是不受欢迎的。
你可能想pgrep
用寻找进程,可能使用-l
或,并在执行它们-lf
之前进行额外的检查。kill
答案2
看起来,使用 procps-ng 中的 pkill,pkill -f
可以匹配自己的命令行并杀死自己,而pkill
macOS 上的 BSD 似乎没有这样做。(我测试了“pkill from procps-ng 3.3.17”)
看linux - 防止进程使用pkill杀死自己 - VoidCC了解避免这种情况的选项。