web-dev-qa-db-ja.com

killallは「プロセスが見つかりません」を表示しますが、ps

killkillallの違いを誰かに説明してもらえますか?なぜkillallpsが示すものを表示しないのですか?

# 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から削除

19
Radek

これはLinuxにありますか?

実際には、pskillallなどによって使用されるコマンド名の微妙に異なるバージョンがいくつかあります。

主な2つのバリエーションは次のとおりです。1)長いコマンド名。これは、ps uを実行したときに取得されるものです。 2)短いコマンド名。これは、フラグなしで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番目のWordをコマンド名として取得するため、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 uまたはps -o cmdによって出力されるコマンド名を使用して一致を試みます。

19
Mikel

killallはプロセス名のマッチングを試みます(ただし、マッチング部分はそれほど優れていません)。

そして、「ps | grep」と「ps | grep | kill」ははるかに優れた仕事をするので、誰かがこれを単純化してpgrepとpkillを作成しました。 「ps grep」や「ps kill」などのコマンドをお読みください。そのコマンドは最初にps、次にgrep、そして必要に応じてkillするためです。

7
Johan

同様の問題がありましたが、/proc/<pid>/statには予期した文字列が含まれていました。 straceを使用すると、killallも/proc/<pid>/cmdlineにアクセスしていることがわかりました。

私はgdbを使用して調査を続け、私の場合、/proc/<pid>/cmdlineにあるすべての引数を含む完全なコマンドに対するコマンドのチェックに失敗したことを発見しました。ファイル名が15文字(killallのソースでハードコードされた値)を超えているためにトリガーされたコードのパスのようです。どういうわけかそれをkillallで動作させることができるかどうかは完全には調査しませんでした。

しかし、他のコメントでここで言及されているように、pkillは同じ問題がないより優れた代替手段です。

pkillのソースコードは、ここ https://github.com/acg/psmisc にあります。

2
Zitrax

Ubuntu 16システムでは、/ proc/pid/statにスレッドの名前が含まれます(プログラムはpthread_setname_npシステムコールを介してこの名前を指定できます)。

0
gerardw