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にありますか?
実際には、ps
、killall
などによって使用されるコマンド名の微妙に異なるバージョンがいくつかあります。
主な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
と同じですが、確認することをお勧めします。
確認すること:
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、そして必要に応じてkillするためです。
同様の問題がありましたが、/proc/<pid>/stat
には予期した文字列が含まれていました。 straceを使用すると、killallも/proc/<pid>/cmdline
にアクセスしていることがわかりました。
私はgdbを使用して調査を続け、私の場合、/proc/<pid>/cmdline
にあるすべての引数を含む完全なコマンドに対するコマンドのチェックに失敗したことを発見しました。ファイル名が15文字(killallのソースでハードコードされた値)を超えているためにトリガーされたコードのパスのようです。どういうわけかそれをkillallで動作させることができるかどうかは完全には調査しませんでした。
しかし、他のコメントでここで言及されているように、pkillは同じ問題がないより優れた代替手段です。
pkill
のソースコードは、ここ https://github.com/acg/psmisc にあります。
Ubuntu 16システムでは、/ proc/pid/statにスレッドの名前が含まれます(プログラムはpthread_setname_npシステムコールを介してこの名前を指定できます)。