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ビット)、PSmisc 22.7のprocpsバージョン3.2.8、GNU coreutils 7.1

答え1

これはLinuxにありますか?

ps実際、killall背中で使用されるコマンド名には少し異なるバージョンがいくつかあります。

2つの主な変形は次のとおりです。 1)実行時に取得する長いコマンド名ps u2)フラグなしで実行したときに取得する短いコマンド名ps

最大の違いは、プログラムがシェルスクリプト、またはインタプリタを必要とするプログラム(Python、Javaなど)の場合に発生する可能性があります。

以下は、違いを示す非常に単純なスクリプトです。私はそれをそう呼ぶmycat

#!/bin/sh
cat

実行後は2種類あります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

2番目のバージョンがどのように始まるか注意してください/bin/sh

今、私が知っている限り、killall実際にはを読み、/proc/<pid>/stat括弧の間の2番目の単語をコマンド名として取得するので、実行時にそれを指定する必要があります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 | 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>

複数のPIDで実行されているGoogle Chromeなどのアプリケーションを終了した場合

私はkillall "Google Chrome"これを使用してすべてのPIDを終了してアプリケーションを強制終了します。

結論として:アプリケーションに複数のPIDがある場合はkillallを試し、PIDが1つしかない場合はkillとkillallが同じように機能します。

関連情報