「ps aux | 「grep x」は「pgrep x」よりも良い結果を出しますか?


82

Ubuntuで次のコマンドを試したところ、何も表示されません。

pgrep php5

php5のプロセスIDを返すべきではありません(次のコマンドはこれを行うだけです)。

ps aux | grep php5

では、これら2つのコマンドの違いは何ですか?

回答:


75

ps aux完全なコマンドライン(パスとパラメーター)が含まれますが、pgrep は実行可能ファイル名の最初の15文字のみを参照します

ps aux各プロセスの完全なコマンドラインを返しますpgrepが、実行可能ファイルの名前のみを調べます。

つまり、greppingの ps aux出力は、プロセスのバイナリのパスまたはパラメーターで発生するすべてのものと一致します。たとえば、

  • ps aux | grep php5 一致します /usr/share/php5/i-am-a-perl-script.pl
  • しかし、しpgrep php5ません

私のシステムから例を見てみましょう-代わりにpythonを使用しますphp5

  • ps aux | grep python 私たちに与えます:
izx 2348 0.0 0.7 514928 15644?Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video
izx 2444 0.0 0.9 547392 18864?Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote
ルート2805 0.0 0.5 95436 12204?S 6月24日0:00 / usr / bin / python / usr / lib / system-service / system-service-d
izx 6272 0.0 2.9 664400 60320?SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager --no-focus-on-map
ルート11729 0.0 0.9 180508 19516?S 6月25日0:00 python / usr / lib / software-properties / software-properties-dbus
  • ただし、上記のリストからわかるように、pgrep pythonのみが返されます11729
ルート11729 0.0 0.9 180508 19516?S 6月25日0:00 python / usr / lib / software-properties / software-properties-dbus

3
「のpgrep -l」も、おそらくバグですが、年齢のために、このようになっていた、15文字までのプロセスを切り捨て
Thorsenの

1
まあ、それは2008年のように上流のバグとしてランチパッドにあります:)「トップとのpsコマンドTRUNCATE後の15文字」bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsenの

2
これは、コメント#3から説明しています。これは、procの一部のプロシージャがからでは/proc/<pid>/statなくコマンド名を取得するという事実によるもの/proc/<pid>/cmdlineです。OK、@ Thorsen、あなたはバグスプレーに勝ちます、それはバグです:P
ish

2
@xczzhh pgrepは不合理なコマンドではありません。うまく機能し、設計どおりです。問題は、実行時にオプションが欠落しているだけであり、それを責めることはできませんpgrep。を使用することps aux | grep xxxは信頼できないのでgrep、出力から自分自身を除外するハックが必要であり、と同様に誤検知を与える可能性がありますps aux | grep root
jlliagre

1
これは、抗薬物商用にする必要があり、bashのツールの作成者は、そう、彼らはこのようなことはよく設計されていたと思ったLSDにブレーズた
アンディ・レイ

78

後者のオプションが欠落しているためps aux | grep x、このコマンドはpgrep x基本的に「より良い」結果を提供します。

デフォルトの動作であるプロセス名だけでなく、コマンドライン全体を検索する-fためのオプションを使用するpgrepだけです。例えば:

pgrep -f php5

ps | grepを除外しgrepたり、パターントリックを使用したりする必要のある構造とは異なり、pgrep設計自体を選択しません。

さらに、パターンがps USER列に表示された場合、出力に不要なプロセスが表示されますが、pgrepこの欠陥はありません。

PIDだけでなく完全な詳細が必要な場合は、次を使用できます。

ps wup $(pgrep -f python)

よりシンプルで信頼性が高い

ps aux | grep python | grep -v grep

または

ps aux | grep p[y]thon

3
また、pidだけでなく完全なコマンドラインを表示する場合は、-a--list-full)オプションも追加します。(古いのpgrepはありませんでした-aこれを上でした-fl。)
ベニCherniavsky-Paskin

1
最初の質問は違いについて尋ねていましたが、これは実際に私たちがpgrep素敵な解決策を模索しようとしていることを示しています。+1
2rs2ts

@ 2rs2tsありがたいことに、尋ねられた質問に答えることができませんでした。修正されました。
jlliagre

プログラム/proc/self/cmdlineが「記述的」に変更された場合、pgrep -fa ruby一致しない場合があります。puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]、「間抜けな」pgrep -a ruby意志。後者もだまされる可能性があるかどうかはわかりません。
ベニチェルニアフスキーパスキン

@ BeniCherniavsky-Paskin私はそれが両方に適用されますので、それが、質問にコメントされている可能性を推測pgrepしてps
フランクリンゆう

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
これは質問に対する答えに答えるかもしれませんが、おそらく、この1行のコマンドが何をするのかを説明するために答えを展開できます。
fossfreedomの

1

現時点でpspgep -f、pgrepは最初の4,096文字に制限されているため、より完全な出力を提供します(多くの場合、長いクラスパスを持つJavaプログラムのエントリクラスを探しているJavaユーザーに影響します)。これを追跡するバグ:https : //gitlab.com/procps-ng/procps/issues/86


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