私は走るps -ejH | less
。出力にはとps
も含まれますless
。
なぜですか?私はそれが次のように動作すると思います:
- 最初に
ps
実行され、その時点に存在するすべてのプロセスがリストされます。 - その後の出力が
ps
供給されますless
。
ただし、このロジックによれば、両方の出力に現れてはps
いけません。less
ps
それでは、これらのプロセスが出力に含まれるのはなぜですかps
?ps
私が説明したものとは少し異なる動作をしますか?
答え1
これシェル両方を開始してパイプの両端を設定すると、ps
パイプのもう一方の端で自分とプロセスを見ることができます。
答え2
しかし、このロジックによれば、psの出力にはpsもlessも現れてはいけません。
はい、すべて表示されるため、ロジックが間違っています。 Un*x シェルでコマンドを実行すると、実際にシェルで実行されるコマンドはほとんどありません。コマンドを実行するには、別のプロセスをフォークします。
2つのコマンドを一緒にパイプすると、2つのコマンドが別々のプロセスで開始され、最初のコマンドの標準出力が2番目のコマンドの標準入力に接続されます。
したがって、ps | lessを実行した直後に3つのプロセスが表示されます。 1つはシェルを実行し、1つはpsを実行し、1つはlessを実行します。出力はpsによって生成されるため、並列で処理されません(必要に応じて時間分割)。両方のコマンドは、バッファリングを最小限に抑えながら、順次ではなく並列に実行されます。
psはプロセスリストを探索しながら、自分とそれ以下だけでなく、親シェル、親シェルの親シェルなどを見つけて表示します。そしてシステムの他のすべて。これが出力にps以下が含まれる理由です。
答え3
使用
ps -ef | grep [l]ess
避けるために。
[l]ess
less
正規表現と一致しますが、固定文字列と一致しません。