셸에서 다음 명령을 고려하세요.ls|less
이제 우리는 ls
이를 알고 less
두 개의 서로 다른 프로세스로 실행합니다. 우리는 쉘이 일련의 함수 중 ls
하나를 사용하여 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
답변2
이는 셸입니다. ps
명령에서 볼 수 있듯이 이 경우 PPID는 less
셸의 PID가 됩니다.
이러한 프로세스에는 공통점이 많지 ls
않습니다 less
. 단지 전자의 표준 출력이 후자의 표준 입력으로 연결된다는 것뿐입니다.
답변3
사용하는 쉘에 따라 다릅니다.
전화해 보세요:
yourshell -c 'echo bla | read VAR; echo $VAR'
그리고 인쇄된 내용을 확인하세요. 또 다른 검사는 다음을 실행하는 것입니다.
yourshell -c 'ps -f| more'
다른 쉘을 사용하고 PID 및 PPID를 확인하십시오.
각 셸은 고유한 접근 방식을 사용합니다.
답변4
파이프라인의 일부를 분기하는 셸에서 실제로 분기를 수행하는 하위 프로세스입니다. 그게 거의 전부입니다. 단, 하위 프로세스는 일반적으로 유지되지 않으며 일반적으로 호출 프로세스로 대체됩니다.
sh -c 'echo "$$"
sh -c "echo \"\$PPID\"" |
cat'
14546
14546
...하지만 아이에게만 준다면아무것아직 해야 할 일이...
sh -c 'echo "$$"
{ sh -c "echo \"\$PPID\""; :; } |
cat'
14556
14557
…주변에 맴돌고 있습니다. 하지만 실제로 이것과 함께 살 필요는 없습니다.
sh -c 'echo "$$"
{ exec sh -c "echo \"\$PPID\""; :; } |
cat'
14563
14563