シェルで次のコマンドを検討してください。ls|less
今、私たちはls
それを知り、less
2つの異なるプロセスで実行します。私たちは、シェルが一連の関数のls
1つを使用して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