回答:
ps aux完全なコマンドライン(パスとパラメーター)が含まれますが、pgrep は実行可能ファイル名の最初の15文字のみを参照しますps aux各プロセスの完全なコマンドラインを返しますpgrepが、実行可能ファイルの名前のみを調べます。
つまり、greppingの ps aux出力は、プロセスのバイナリのパスまたはパラメーターで発生するすべてのものと一致します。たとえば、
ps aux | grep php5 一致します /usr/share/php5/i-am-a-perl-script.plpgrep 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