プロセス内の `ps -e | less`に「less」が表示されるのはなぜですか? [コピー]

プロセス内の `ps -e | less`に「less」が表示されるのはなぜですか? [コピー]

私は走るps -ejH | less。出力にはとpsも含まれますless

なぜですか?私はそれが次のように動作すると思います:

  1. 最初にps実行され、その時点に存在するすべてのプロセスがリストされます。
  2. その後の出力がps供給されますless

ただし、このロジックによれば、両方の出力に現れてはpsいけません。lessps

それでは、これらのプロセスが出力に含まれるのはなぜですかpsps私が説明したものとは少し異なる動作をしますか?

答え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]essless正規表現と一致しますが、固定文字列と一致しません。

関連情報