송신 파이프 프로세스의 PID를 가져옵니다.

송신 파이프 프로세스의 PID를 가져옵니다.

~을 위한

$ 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/1Display as Symlink를 찾아 flags에서 확인 pipe:[43270]합니다 . 그래서 파이프의 다른 쪽 끝을 제어하는 ​​프로세스를 찾습니다./proc/1729/fdinfo/101

참고:

  • 이는 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)

관련 정보