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 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
が、確認することをお勧めします。
確認すべき事項:
cat /proc/<pid>/stat
コマンド名とは何ですか?ps -e | grep db2
コマンド名とは何ですか?- Do
ps -e | grep db2
とps au | grep db2
showのコマンド名は同じですか?
ノート
他の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が同じように機能します。