~을 위한
$ any-process | receiver
receiver
전송 프로세스의 PID를 얻을 수 있나요 ?
답변1
간접적. 예, 하지만 연결된 파이프를 식별한 다음 연결된 파이프에 대한 다른 모든 PID를 검색해야 합니다.
PID가 1730 이라고 가정합니다 receiver
. 를 보고 /proc/self/fd/0
(더 간단하게는 /proc/self/fd/0
) 로 표시되는 심볼릭 링크를 볼 수 있습니다 pipe:[43270]
. /proc/1730/fdinfo/0
. 그런 다음 /proc/1729/fd/1
Display as Symlink를 찾아 flags에서 확인 pipe:[43270]
합니다 . 그래서 파이프의 다른 쪽 끝을 제어하는 프로세스를 찾습니다./proc/1729/fdinfo/1
01
참고:
- 이는 Linux에 특화된 접근 방식으로 이식성이 없고 비효율적입니다.
- 여러 프로세스가 해당 파이프에 쓸 수 있습니다(또한 쓰기가 fd 1에 있을 필요가 전혀 없음).
- 경쟁 조건이 발생하기 쉽습니다.
any-process
다른 사용자가 소유 한 경우receiver
해당 파일 설명자를 볼 수 없습니다.
두 프로세스가 인증된 방식으로 통신하도록 하려면 Unix 소켓을 사용해야 합니다. SO_PASSCRED
옵션을 통해 SCM_CREDENTIALS
발신자의 pid, uid 및 gid 유형으로 보조 메시지를 사용할 수 있습니다. 보낸 사람이 지정한 자격 증명은 커널에서 검사하여 거짓말이 아닌지 확인합니다(적절한 기능이 없는 경우 루트 프로세스/CAP_SYS_ADMIN회의자신과 다른 프로세스 ID를 지정하는 기능)
답변2
실행 프로세스를 파일 설명자 3으로 리디렉션하면 간단한 방법을 얻을 수 있습니다. 아래 예는 다음과 같습니다.잠명령이 파이프로 전달됨메모주문하다:
( sleep 100 & echo $!>&3 ) 3>pid | ps -p "$(<pid)"
sleep 명령 프로세스를 확인할 수 있습니다.
ps -p $(<pid)