`ps -e | less` がプロセス間で 'less' を表示するのはなぜですか?

`ps -e | less` がプロセス間で 'less' を表示するのはなぜですか?

を実行しますps -ejH | less。出力には と も含まれpsますless

理由は何でしょうか? 次のように動作すると思いました:

  1. まず、psが実行され、その時点で存在するすべてのプロセスがリストされます。
  2. 次に、 の出力psが に入力されますless

しかし、この論理によれば、の出力にはpsnotも表示されないはずです。lessps

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

答え1

シェル両方を開始してパイプの端を確立し、psパイプのもう一方の端のプロセスだけでなく自分自身も確認します。

答え2

「しかし、この論理によれば、ps の出力には ps も less も表示されないはずです。」

はい、あなたの論理は間違っています。なぜなら、両方表示されるからです。Un*x シェルでコマンドを実行すると、実際にシェルで実行されるコマンドはごくわずかです (ある場合)。そのコマンドを実行するために別のプロセスがフォークされます。

2 つのコマンドをパイプで接続すると、両方のコマンドが別々のプロセスで起動され、最初のコマンドの stdout が 2 番目のコマンドの stdin にリンクされます。

したがって、ps|less を実行するとすぐに、3 つのプロセスが作成されます。1 つはシェルを実行し、1 つは ps を実行し、もう 1 つは less を実行します。出力は ps によって生成されるため、less によって並列に処理されます (必要に応じてタイムスライスされます)。両方のコマンドは、最小限のバッファリングで、順番にではなく並列に実行されます。

ps がプロセス リストを順に処理していくと、ps 自身と less の両方、さらに親シェル、さらにその親、そして init までを検索して表示します。そして、システム上の他のすべても検索して表示します。出力に ps と less の両方が含まれるのはそのためです。

答え3

使用

ps -ef | grep [l]ess

より少なく避けるために。

  • [l]ess正規表現としては一致しますlessが、固定文字列としては一致しません。

関連情報