どのプロセスを確認するとき、私は通常次のように書き込みます。
ps aux | grep myprocess
そして時々私が得た結果
eimantas 11998 0.0 0.0 8816 740 pts/0 S+ 07:45 0:00 grep myprocess
プロセスが実行されていない場合。
ps
grepがコマンドの出力をフィルタリングする場合、プロセスリストに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 myprocess
、ps aux
is include を提供するとgrep myprocess
grep はこれを出力に含めます。
これを確認するために、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
これはシェルに次のものが必要であることを意味します。
- 移動する
ps
。 - すべての出力をバッファリングします(これ以上行く場所がないため)。
- 移動する
grep
。 - 保存した出力を
grep
sに供給しますstdin
。
これは無駄です。最初に呼び出すことは、メモリを使用してgrep
入力を待ってからps
sをstdout
直接供給するより効率的な方法です。grep
stdin
あるいは、極端なケースを考慮するには、次のような無限の出力を生成するプログラムの出力をパイプする場合を考えます。
$ yes | less
シェルがyes
以前に実行されると、less
永遠に(またはコンピュータのメモリが完全に使い果たされるまで)待ちます。