回答:
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
/proc/<pid>/stat
なくコマンド名を取得するという事実によるもの/proc/<pid>/cmdline
です。OK、@ Thorsen、あなたはバグスプレーに勝ちます、それはバグです:P
pgrep
は不合理なコマンドではありません。うまく機能し、設計どおりです。問題は、実行時にオプションが欠落しているだけであり、それを責めることはできませんpgrep
。を使用することps aux | grep xxx
は信頼できないのでgrep
、出力から自分自身を除外するハックが必要であり、と同様に誤検知を与える可能性がありますps aux | grep root
。
後者のオプションが欠落しているため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
pgrep
素敵な解決策を模索しようとしていることを示しています。+1
/proc/self/cmdline
が「記述的」に変更された場合、pgrep -fa ruby
一致しない場合があります。puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
、「間抜けな」pgrep -a ruby
意志。後者もだまされる可能性があるかどうかはわかりません。
pgrep
してps
。
diff <(ps aux|grep x) <(pgrep x) # :)
現時点でps
はpgep -f
、pgrepは最初の4,096文字に制限されているため、より完全な出力を提供します(多くの場合、長いクラスパスを持つJavaプログラムのエントリクラスを探しているJavaユーザーに影響します)。これを追跡するバグ:https : //gitlab.com/procps-ng/procps/issues/86