kill
有人可以向我解释一下和之间的区别killall
吗?为什么killall
看不到什么ps
节目?
# ps aux |grep db2
root 1123 0.0 0.8 841300 33956 pts/1 Sl 11:48 0:00 db2wdog
db2inst1 1125 0.0 3.5 2879496 143616 pts/1 Sl 11:48 0:02 db2sysc
root 1126 0.0 0.6 579156 27840 pts/1 S 11:48 0:00 db2ckpwd
root 1127 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
root 1128 0.0 0.6 579156 27828 pts/1 S 11:48 0:00 db2ckpwd
# killall db2ckpwd
db2ckpwd: no process found
# kill -9 1126
# kill -9 1127
# kill -9 1128
系统是SuSe 11.3(64位);内核 2.6.34-12; procps 版本 3.2.8;来自 PSmisc 22.7 的 Killall;从 GNU coreutils 7.1 中杀死
答案1
这是在 Linux 上吗?
ps
实际上,killall
、 等使用的命令名称有几个略有不同的版本。
两个主要变体是:1)长命令名,这是运行时得到的ps u
; 2) 短命令名称,这是在没有任何标志的情况下运行时得到的ps
。
如果您的程序是 shell 脚本或任何需要解释器的程序(例如 Python、Java 等),则可能会出现最大的差异。
这是一个非常简单的脚本,演示了其中的差异。我称它为mycat
:
#!/bin/sh
cat
运行之后,有两种不同类型的ps
。
首先,没有u
:
$ ps -p 5290
PID TTY ... CMD
5290 pts/6 ... mycat
其次,与u
:
$ ps u 5290
USER PID ... COMMAND
mikel 5290 ... /bin/sh /home/mikel/bin/mycat
请注意第二个版本如何开头/bin/sh
?
现在,据我所知,killall
实际上读取了/proc/<pid>/stat
,并获取括号之间的第二个单词作为命令名称,因此这确实是您在运行时需要指定的内容killall
。从逻辑上讲,这应该与ps
没有标志时所说的相同u
,但检查一下是个好主意。
需要检查的事项:
cat /proc/<pid>/stat
命令名称是什么?ps -e | grep db2
命令名称是什么?- do
ps -e | grep db2
和ps au | grep db2
show 相同的命令名?
笔记
如果您也使用其他 ps 标志,那么您可能会发现使用ps -o comm
查看短名称和ps -o cmd
查看长名称更简单。
您也可能会找到pkill
更好的选择。特别是,pkill -f
尝试使用完整的命令名称进行匹配,即由ps u
或打印的命令名称ps -o cmd
。
答案2
killall
尝试匹配进程名称(但实际上并不擅长匹配部分)。
由于ps | grep
和ps | grep | kill
做得更好,有人简化了它并创建了pgrep
和pkill
。阅读该命令,如ps grep
和ps kill
,因为该命令首先ps
然后grep
如果想要杀死。
答案3
我遇到了类似的问题,但/proc/<pid>/stat
包含了预期的字符串。通过使用 strace 我可以看到 Killall 也访问了/proc/<pid>/cmdline
.
我继续使用 gdb 进行调查,发现在我的情况下,它在检查我的命令到完整命令(包括/proc/<pid>/cmdline
.看起来代码的路径是由于文件名超过 15 个字符(这是 Killall 源代码中的硬编码值)而触发的。我没有充分调查是否可以以某种方式让它与killall 一起工作。
但正如其他评论中提到的,pkill 是一个更好的选择,不存在相同的问题。
源代码pkill
可以在这里找到https://github.com/acg/psmisc对于有兴趣的人。
答案4
大多数情况下kill PID
都会起作用。
识别PID使用pgrep <application name>
如果您已经终止了像 Google Chrome 这样使用多个 PID 运行的应用程序
我会使用killall "Google Chrome"
它通过杀死所有 PID 来强制退出应用程序。
结论:如果您的应用程序有多个 PID,请尝试killall,如果只有一个PID,则kill 和killall 的工作原理相同。