これは 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番目の単語をコマンド名として取得するため、 killall
を実行するときに実際に指定する必要があるものです .論理的には、それは ps
と同じはずです u
なし flag は言っていますが、確認することをお勧めします。
確認事項:
<オール>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 をご覧ください。