파이프를 통해 쉘이 시작한 프로세스의 상위-하위 관계를 제어하는 ​​규칙은 무엇입니까?

파이프를 통해 쉘이 시작한 프로세스의 상위-하위 관계를 제어하는 ​​규칙은 무엇입니까?
#!/bin/ksh
# start_service: start the service
my_server_executable 2>&1 | my_pipe_following_shell_script &
exit 0

명령줄에서 위 스크립트를 실행한 후 start_service실행 중인 프로세스가 명령을 사용하는 상위 프로세스라는 것을 확인했으며 예상한 결과는 다음과 같습니다.psbashmy_pipe_following_shell_scriptmy_server_executable그리고 필요하다후자는 PID 1( )이 소유합니다 init.

이런 일이 발생하는 이유와 이를 방지하는 방법에 대한 설명을 찾고 있습니다..

또한, 뒤에서 무슨 일이 일어나고 있는지 디버깅/검사하려면 어떻게 해야 합니까? 달리기는 별로 도움이 start_service되지 strace않았습니다. 출력에서 내가 찾은 유일한 흥미로운 줄은 다음과 같습니다.

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f05708) = 30431

30431PID는 어디에 있습니까 my_pipe_following_shell_script?


리눅스 2.6.18-308.16.1.el5PAE

ksh 버전 sh(AT&T Research) 93t+ 2010-02-02

GNU bash, 버전 3.2.25(1)-릴리스(i686-redhat-linux-gnu)

답변1

이 경우 쉘은 ksh프로세스의 상위입니다.둘 다파이프의 양쪽에서 시작됩니다. 하나를 시작하는 것과 다른 것을 시작하는 것 사이에서 하는 일은 그들 사이에 파이프를 설정하는 것입니다.표준 출력가장 먼저 가려면표준 입력두번째.

백그라운드에서 두 프로세스 집계를 실행해야 하는 경우 다음을 수행할 수 있습니다.

( my_server_executable 2>&1 | my_pipe_following_shell_script ) &

그러면 파이프로 연결된 두 개의 프로그램이 하나로 시작됩니다.서브쉘, 배경에 넣어서 &.

관련 정보