killall 给了我`没有找到进程`但是ps

Rad*_*dek 23 linux process kill 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
Run Code Online (Sandbox Code Playgroud)

系统为 SuSe 11.3(64 位);内核 2.6.34-12;procps 版本 3.2.8;来自 PSmisc 22.7 的 killall;从 GNU coreutils 7.1 杀死

Mik*_*kel 23

这是在 Linux 上吗?

实际上pskillall、 等使用的命令名称有一些微妙的不同版本。

两个主要的变体是:1) 长命令名,这是你运行时得到的ps u;和 2) 短命令名称,这是您在ps没有任何标志的情况下运行时获得的名称。

如果您的程序是 shell 脚本或任何需要解释器的东西,例如 Python、Java 等,那么可能最大的区别就会发生。

这是一个非常简单的脚本来演示差异。我称之为mycat

#!/bin/sh
cat
Run Code Online (Sandbox Code Playgroud)

运行后,这是两种不同类型的ps.

首先,没有u

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat
Run Code Online (Sandbox Code Playgroud)

其次,与u

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat
Run Code Online (Sandbox Code Playgroud)

注意第二个版本是如何以/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 db2显示相同的命令名称?

笔记

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

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


Joh*_*han 8

killall 尝试匹配进程名称(但在匹配部分并不是那么好)。

由于“ps | grep”和“ps | grep | kill”做得更好,有人对此进行了简化并创建了 pgrep 和 pkill。阅读诸如“ps grep”和“ps kill”之类的命令,因为该命令首先是 ps 然后是 grep 并且如果需要则杀死。