Killall 给我“没有找到进程”,但是 ps

Killall 给我“没有找到进程”,但是 ps

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,但检查一下是个好主意。

需要检查的事项:

  1. cat /proc/<pid>/stat命令名称是什么?
  2. ps -e | grep db2命令名称是什么?
  3. dops -e | grep db2ps au | grep db2show 相同的命令名?

笔记

如果您也使用其他 ps 标志,那么您可能会发现使用ps -o comm查看短名称和ps -o cmd查看长名称更简单。

您也可能会找到pkill更好的选择。特别是,pkill -f尝试使用完整的命令名称进行匹配,即由ps u或打印的命令名称ps -o cmd

答案2

killall尝试匹配进程名称(但实际上并不擅长匹配部分)。

由于ps | grepps | grep | kill做得更好,有人简化了它并创建了pgreppkill。阅读该命令,如ps grepps 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 的工作原理相同。

相关内容