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 上吗?
实际上ps
,killall
、 等使用的命令名称有一些微妙的不同版本。
两个主要的变体是: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
标志的情况相同,但最好检查一下。
检查事项:
cat /proc/<pid>/stat
说的命令名称是什么?ps -e | grep db2
说的命令名称是什么?ps -e | grep db2
并ps au | grep db2
显示相同的命令名称?笔记
如果您也使用其他 ps 标志,那么您可能会发现使用ps -o comm
查看短名称和ps -o cmd
查看长名称更简单。
您也可能会找到pkill
更好的选择。特别是,pkill -f
尝试使用完整的命令名称进行匹配,即由ps u
或打印的命令名称ps -o cmd
。
killall 尝试匹配进程名称(但在匹配部分并不是那么好)。
由于“ps | grep”和“ps | grep | kill”做得更好,有人对此进行了简化并创建了 pgrep 和 pkill。阅读诸如“ps grep”和“ps kill”之类的命令,因为该命令首先是 ps 然后是 grep 并且如果需要则杀死。
归档时间: |
|
查看次数: |
26270 次 |
最近记录: |