쉘에서 명령을 파이프하는 프로세스를 분기한 사람은 누구입니까?

쉘에서 명령을 파이프하는 프로세스를 분기한 사람은 누구입니까?

셸에서 다음 명령을 고려하세요.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

관련 정보