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


17

誰かが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からkill


決して SIGKILLでプロセスを強制終了していない(-9)。
フォンブランド

プロセスを終了する必要がある場合はどうしますか?
ラデック

これは非常に最後の手段です。
フォンブランド

回答:


19

これは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番目の単語を読み取り、取得します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ます。


非常に良い説明。そして、あなたは初めて正しかったと思います。ps -e |grep db2 gives me 3084?夜12時00分00秒db2syscr`とPS補助| grepのDB2は私を与えますroot 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd。それについてコメントできました。私は少し迷います。
ラデク

よく分かりません。プログラムの名前が変更されている可能性があります。実行方法を知っていますか?何てls -l /proc/3084/exe言うの?どの程度whichか、whenceまたはtypeファイルを検索し、その後、lsおよびtypeそれがシンボリックリンクやスクリプトやバイナリだかどうかを確認するために?
ミケル

ls -l / proc / 3084 / exeは私たちに与えるlrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscrは私に与える-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek

タイプは私に/ var / lib / db2 / db2inst1 / sqllib / adm / db2syscrを与える/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

6

killallは、プロセス名でのマッチングを試みます(しかし、実際にはマッチング部分がそれほど良くありません)。

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


2

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

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

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

ソースコードはpkillここで見つけることができますhttps://github.com/acg/psmisc興味のために。


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.