web-dev-qa-db-ja.com

「ps aux | grep x」が「pgrep x」よりも良い結果を出すのはなぜですか?

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

pgrep php5

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

ps aux | grep php5

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

81
xczzhh

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

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

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

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

私のシステムの例を見てください-php5の代わりにpythonを使用するだけです:

  • 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
root 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 
 root 11729 0.0 0.9 180508 19516? S 6月25日0:00 python /usr/lib/software-properties/software-properties-dbus
  • しかしpgrep python11729のみを返します。これは上記のリストからわかります:
ルート11729 0.0 0.9 180508 19516? S 6月25日0:00 python / usr/lib/software-properties/software-properties-dbus
73
ish

ps aux | grep xコマンドは、pgrep xよりも優れた結果を提供します。これは、後者のオプションが欠落しているためです。

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

pgrep -f php5

grep行を除外したり、パターントリックを使用したりする必要があるps | grep構造とは異なり、pgrepは設計によって選択されません。

さらに、パターンがpsUSER列に表示された場合、出力に不要なプロセスが発生します。pgrepはこの欠陥の影響を受けません。

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

ps wup $(pgrep -f python)

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

ps aux | grep python | grep -v grep

または

ps aux | grep p[y]thon
78
jlliagre
diff <(ps aux|grep x) <(pgrep x) # :)
3
Thorsen