Linux

killall 給了我找不到程序但是 ps

  • October 14, 2021

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 殺死

這是在Linux上嗎?

實際上pskillall, 等使用的命令名稱有幾個微妙不同的版本。

兩個主要變體是: 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. 執行ps -e | grep db2ps au | grep db2顯示相同的命令名稱?

筆記

如果您也在使用其他 ps 標誌,那麼您可能會發現使用ps -o comm查看短名稱和ps -o cmd查看長名稱更簡單。

您也可能會找到pkill更好的選擇。特別是,pkill -f嘗試使用完整的命令名稱進行匹配,即由ps uor列印的命令名稱ps -o cmd

引用自:https://unix.stackexchange.com/questions/14479