シェルからコマンドをパイプするプロセスを分岐した人は誰ですか?

シェルからコマンドをパイプするプロセスを分岐した人は誰ですか?

シェルで次のコマンドを検討してください。ls|less

今、私たちはlsそれを知り、less2つの異なるプロセスで実行します。私たちは、シェルが一連の関数のls1つを使用してexec()プログラムをロードするサブプロセスを分岐して生成することを知っています。

私の質問は:誰がコマンドを実行したプロセスを分岐しましたかless?シェルですか、それともコマンドを実行するプロセスですかls

ベストアンサー1

いくつかの実験:

$ yes | sleep 10m &
[1] 32395 32396
$ pstree -pa $(ps -o ppid= -p $(pgrep yes))
zsh,29630
  ├─pstree,32402 -pa 29630
  ├─sleep,32396 10m
  └─yes,32395

両方のプロセスの親プロセスがシェルであることがわかります。

より長いパイプを使用してください。

$ sleep 10m | sleep 10m | sleep 10m | sleep 10m &
[1] 32320 32321 32322 32323
$ pstree -pa $(ps -o ppid= -p $(pgrep sleep -o)) 
zsh,29630
  ├─pstree,32498 -pa 29630
  ├─sleep,32473 10m
  ├─sleep,32474 10m
  ├─sleep,32475 10m
  └─sleep,32476 10m

実際、これらのプロセスは依然としてシェルの子プロセスです。

サブシェルの使用:

$ sleep 10m | ( sleep 10m | sleep 10m ) | sleep 10m &
[1] 595 596 597
$ pstree -pa $(ps -o ppid= -p $(pgrep sleep -o))     
zsh,29630
  ├─pstree,610 -pa 29630
  ├─sleep,595 10m
  ├─sleep,597 10m
  └─zsh,596
      ├─sleep,598 10m
      └─sleep,599 10m

おすすめ記事