在普通的kill <some_pid>
Unix 系统上使用多年之后,我pkill
从一位年轻的、精通 Linux 的同事1那里学到了一些东西。
我很快就接受了 Linux 的方式,日日夜夜pgrep
地工作pkill
,克服了速度减慢和竞争条件。这一切都很好。
但现在我只看到了killall
。操作指南似乎只提到了killall
,我不确定这是否是某种并行开发,或者是killall
的后继pkill
,或者是别的什么。
它似乎发挥了更有针对性的作用pkill
,但我肯定我遗漏了一些东西。
精通 Ubuntu/Debian 的2人能否解释一下何时(或为什么)killall
应该使用,特别是是否应该优先使用它pkill
(何时pkill
通常看起来更容易,因为我可以更草率地进行名称匹配,至少默认情况下)。
当我提到 时killall
,我并没有想到在某些 Unix 系统(Solaris、AIX 等)上会终止所有用户进程的命令。以下是该版本的描述,来自IBM AIX 的手册页:
killall 命令会取消您启动的所有进程(生成 killall 进程的进程除外)。此命令提供了一种方便的方法来取消您控制的 shell 创建的所有进程。当由 root 用户启动时,killall 命令会取消所有可取消的进程(启动它的进程除外)。如果指定了多个信号,则只有最后一个信号有效。
1 “同事”是从“同事”免费升级而来的,所以不妨如此。2
最初我以为这是 Linux 或 Debian 的事情,但一些消息来源说 Linuxkillall
源自 BSD 风格的 Unix。
答案1
我认为您在操作方法中看到了 killall,因为默认情况下它需要精确的进程名称,而 pkill 执行基本的模式匹配。因此,killall 对于用户盲目复制和粘贴来说更安全。
Pkill 和 killall 都有不同的选项。Killall 有一个标志用于按进程年龄进行匹配,pkill 有一个标志用于仅杀死给定 tty 上的进程。等等,不胜枚举。两者都不好,他们只是有不同的专长。
我从他们的手册页中看到 killall 来自psmisc 包,它有几个进程管理实用程序,但值得注意的是不包含ps
。它是procps 包其中包括 ps、top、kill 和 pkill(以及其他)。我敢打赌 procps 最初没有 pkill,所以 psmisc 想出了 killall。
这pkill/pgrep 手册页据说它们是在 Solaris 7 中引入的。正如你提到的,杰贝拉夸,Solaris 的 killall 不是 psmisc 提供的实用程序,因此 Solaris 可能只有 procps 包。有人想要一个模式匹配进程工具,因此有了 pkill 和 pgrep。我不知道它是由 procps dev 开发的还是后来添加的。无论如何,它还是进入了 *nix 并成为各地的一部分。
更多来源:
答案2
请谨慎使用“killall”。在某些系统上(我忘了是哪个系统),killall 会杀死全部进程。它将默默地忽略参数并使您的系统完全停止。
答案3
如果你激活 /etc/bash_completion,然后killall <part_of_process_name>
按 Tab 键 - 自动从正在运行的进程列表中完成进程名称
答案4
除了其他答案之外,另一个让它更傻瓜化的区别是它killall
会告诉你
未找到任何进程
如果该进程不存在,whilepkill
就不会存在。