grepは私のpsに侵入しています。

grepは私のpsに侵入しています。

どのプロセスを確認するとき、私は通常次のように書き込みます。

ps aux | grep myprocess

そして時々私が得た結果

eimantas 11998  0.0  0.0   8816   740 pts/0    S+   07:45   0:00 grep myprocess

プロセスが実行されていない場合。

psgrepがコマンドの出力をフィルタリングする場合、プロセスリストにgrepが表示される理由を知りたいです。後ろに psもう逃げましたか?

答え1

この動作は完全に正常であり、bashがパイプの使用を管理する方法によって発生します。

パイプは bash を使用して実装されます。pipeシステムコール。その呼び出し後、bashは標準入力(ファイル記述子0)正しいプロセス()の入力を使用してくださいgrep。基本的なbashプロセスは別のフォークを生成し、標準入力の代わりにfifoの出力記述子を渡します(ファイル説明1)左側のコマンドを実行します。

ユーティリティはpsコマンドの後に始まるので、grep出力で確認できます。

信頼できない場合は、set -xアクティベーションコマンドトレースを使用できます。たとえば、

+ ps aux
+ grep --color=auto grep
+ grep --color=auto systemd
alexises  1094  0.0  0.8   6212  2196 pts/0    S+   09:30   0:00 grep --color=auto systemd

詳細な手順については、基本Cシェルの次のセクションを参照してください。http://www.cs.loyola.edu/~jglenn/702/S2005/Examples/dup2.html

答え2

プロセスの存在にのみ興味がある場合は、pgrepこの動作を表示しないプロセスを使用してください。たとえば、次のようになります。

$ pgrep myprocess
1900

他の場合(より多くの情報に興味がある場合)、通常は| grep -v grep削除するgrep行を追加します。たとえば、次のようになります。

$ ps -ef | grep myprocess| grep -v grep

答え3

pipeのように動作しません。;両方のプロセスを同時に開始します。そのgrepため、このコマンドも表示されます。したがってps aux | grep myprocessps auxis include を提供するとgrep myprocessgrep はこれを出力に含めます。

これを確認するために、ddテストサーバーで次の2つのコマンドを実行しました。

[sreeraj@server ~]$ dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024 | dd  if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024

プロセスを確認すると、dd両方のプロセスが同時に開始されたことがわかります(2:55分が経過したことを示すバーを確認してください)。

[sreeraj@server ~]$ ps aux | grep 'dd if'
sreeraj  14891  100  0.2   5376  1416 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile1 bs=1M count=1024
sreeraj  14892  100  0.2   5376  1412 pts/0    R+   11:56   2:55 dd if=/dev/urandom of=/home/sreeraj/myfile2 bs=1M count=1024
sreeraj  14936  0.0  0.1   9032   672 pts/1    S+   11:59   0:00 grep --color=auto dd if
[sreeraj@server ~]$

grepの出力を除外するには、正規表現を使用します。grep結果から除外されます。

ps aux | grep "[m]yprocess"

たとえば、httpdプロセスを探している場合は、次のようにします。

ps aux | grep "[h]ttpd"

しかし、私はそれを使用することをお勧めしますpgrep -a。より安定しています。

[sreeraj@server ~]$ pgrep -a httpd
8507 /usr/sbin/httpd -DFOREGROUND
8509 /usr/sbin/httpd -DFOREGROUND
8510 /usr/sbin/httpd -DFOREGROUND
8511 /usr/sbin/httpd -DFOREGROUND
8513 /usr/sbin/httpd -DFOREGROUND
8529 /usr/sbin/httpd -DFOREGROUND
[sreeraj@server ~]$

答え4

次の事故実験を考えてみましょう。実行が呼び出されるべきであると考えるps前に実行が完了した場合、grepこれはシェルに次のものが必要であることを意味します。

  1. 移動するps
  2. すべての出力をバッファリングします(これ以上行く場所がないため)。
  3. 移動するgrep
  4. 保存した出力をgrepsに供給しますstdin

これは無駄です。最初に呼び出すことは、メモリを使用してgrep入力を待ってからpssをstdout直接供給するより効率的な方法です。grepstdin

あるいは、極端なケースを考慮するには、次のような無限の出力を生成するプログラムの出力をパイプする場合を考えます。

$ yes | less

シェルがyes以前に実行されると、less永遠に(またはコンピュータのメモリが完全に使い果たされるまで)待ちます。

関連情報