ps 출력에 파이프라인 프로세스를 표시하는 방법은 무엇입니까?

ps 출력에 파이프라인 프로세스를 표시하는 방법은 무엇입니까?

inotifywait/tmp 디렉토리에서 새 파일을 모니터링하고 출력을 다음으로 파이프하는 매우 간단한 스크립트가 있습니다 sed.

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'

then 의 출력을 확인하면 pstree이를 볼 수 있고 inotifywait실제로 sed실행 중입니다.

  |-bash(20568)---test(8208)-+-inotifywait(8209)
  |                          `-sed(8210)

inotifywait이제 while 루프의 출력을 직접 파이프하는 대신 다음으로 파이프하면 sed:

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | 
  while IFS= read -r file; do
    sed 's/a/b/' "$file"
  done

..다음에 따르면 pstree:

    |-bash(20568)---test(8979)-+-inotifywait(8980)
    |                          `-test(8981)

..그리고 ps:

$ ps -p 8981 -o command
COMMAND
/bin/bash ./test
$

..외부 유틸리티가 아닌 쉘을 시작합니다 sed. 쉘이 내장되어 있기 while때문에 이것이 맞습니까 ?bash

답변1

파이프라인의 프로세스 관계는 주로 사용하는 셸에 따라 달라집니다.

최신 셸은 파이프라인의 모든 간단한 프로세스(명령)를 기본 셸의 하위 항목으로 직접 만듭니다.

이전 셸에서는 구현별로 다른 방식으로 이 작업을 수행합니다.

입력이 리디렉션되면 일부 쉘은 하위 쉘 내에서 while 루프를 실행하지만 다른 쉘은 그렇지 않습니다.

while이는 쉘 내장 명령이 아니라 쉘 구문의 일부입니다.

결론: 해당 쉘의 작성자가 아니고 해당 특정 쉘에서 현재 예상되는 방식으로 작업이 작동하는지 확인하려는 경우가 아니면 복잡한 쉘 명령에서 상위-하위 관계를 분석하려고 시도하지 마십시오.

관련 정보