파이프라인의 인접한 프로세스가 실행되었는지 확인

파이프라인의 인접한 프로세스가 실행되었는지 확인

내 파이프라인에는 일련의 프로세스가 있습니다.

cat haystack | grep needle | my_process | less

내 이해는 쉘이 각 명령에 대해 동시에 포크하고 execve를 실행한다는 것입니다.

my_process에서 PID를 결정했다고 가정할 때 grep 및 less가 완전히 시작되었는지(execve'd) 어떻게 확인합니까?

답변1

음, Linux에서는 다음을 확인할 수 있습니다./proc/PID/exe

(p=$BASHPID; /bin/ls -l /proc/$p/exe; exec /bin/ls -l /proc/$p/exe)
... 0 Jan 17 10:34 /proc/17816/exe -> /bin/bash
... 0 Jan 17 10:34 /proc/17816/exe -> /bin/ls

그러나 나는 이것의 이점을 실제로 보지 못합니다. 쉘은 before 파이프를 읽거나 쓸 수 없으므로 exec파이프는 before 시간이 조금 있어도 원활하게 작동합니다 exec. 사실, 이것은작은exec잠시 후에 실행 중인 프로그램을 검사하기 위해 그곳에 갈 수 있을 때에도 이런 일이 발생하더라도 나는 놀라지 않을 것입니다.

답변2

이것이 열린 파일 설명자를 상속하는 목적입니다.

FIFO를 생성합니다. 상위 셸에서 close-on-exec 쓰기 전용 파일 설명자를 엽니다. 모든 fork()ed 하위 항목은 이를 상속한 다음 execve(). 검색해야 하는 프로세스에 대한 읽기 전용 파일 설명자를 열거 execve()나 프로세스가 이미 열려 있는 읽기 전용 파일 설명자를 상속하도록 합니다. 쓰기 전용 끝이 닫히면 execve()읽기 전용 끝은 EOF를 반환합니다.

개인을 탐지하기 위해 execve()여러 FIFO로 일반화할 수 있습니다. 사실, FIFO에 신경 쓸 필요가 없습니다.두 번째 파이프 세트를 사용하십시오., 쓰기 파일 설명자는 close-on-exec로 설정됩니다.

이것이 실제로 무엇인지 설명하지 않았기 때문에~을 위한, 실제로 수행하려는 작업에 이를 구축하는 방법을 알아내는 것이 귀하의 임무입니다.

답변3

Linux 전용이며 다음과 함께 제공됩니다 zsh.

$ autoload zsh/stat
$ (zstat +link /proc/*/fd/0(e'{[[ $REPLY -ef /proc/self/fd/1 ]] &&
    reply=$REPLY:h:h/exe}')) | cat
/bin/cat

이는 표준 입력에서 열리는 하위 쉘의 표준 출력과 동일한 파이프를 가진 프로세스의 실행 파일에 대한 경로를 제공합니다. 따라서 위의 시간은 cat이미 실행되었습니다.

관련 정보