내 파이프라인에는 일련의 프로세스가 있습니다.
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
이미 실행되었습니다.