유닉스 파이프 반대편의 프로세스 이름은 무엇입니까?

유닉스 파이프 반대편의 프로세스 이름은 무엇입니까?

두 프로세스가 파이프를 통해 연결되면,

> cmd1 | cmd2

cmd1파이프( ) 반대편에 있는 프로세스의 이름(또는 PID)을 알아낼 수 있는 방법이 있나요 cmd2?

cmd2또한 그 반대의 경우에도 이름/PID를 얻을 수 있는 방법이 있습니까 cmd1?

출력이 터미널에 도착하는지(또는 입력이 터미널에서 오는지) 확인 해야 한다는 것을 알고 있으므로 isatty(3)상대방에 대해 더 자세히 알 수 있는 방법이 있는지 궁금합니다.

답변1

에서 파이프라인을 볼 수 있습니다 /proc/$PID/fd. 설명자는 기호 링크와 유사합니다 pipe:[188528098]. 이 정보를 사용하여 다른 프로세스를 검색할 수 있습니다.

$ lsof -n | grep -w 188528098
sleep      1565   hl    1w     FIFO    0,12     0t0  188528098 pipe
sleep      1566   hl    0r     FIFO    0,12     0t0  188528098 pipe

또는 자동 처리를 위해 숫자가 파일 이름이 아닌 소켓의 일부인지 확인하려는 경우:

$ lsof -n | awk 'NF==9 && $5=="FIFO" && $9=="pipe" && $8==188528098'

4.88 이상의 경우 또는 플래그를 lsof사용할 수도 있습니다 .-E+E

-p <pid>와 결합하면 -d <descriptor>특정 엔드포인트 정보를 얻을 수 있습니다.설명자주어진PID.

$ sleep 1 | sh -c 'lsof -E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sh      27176 chazelas    0r  FIFO   0,10      0t0 2609460 pipe 27175,sleep,1w

위의 내용은 fd0 of sh가 파이프이고 sleep다른 쪽 끝이 fd 1 of임을 나타냅니다. fd를 다음 -E과 같이 변경하면 +Efd에 대한 완전한 정보를 얻을 수도 있습니다 sleep.

$ sleep 1 | sh -c 'lsof +E -ap "$$" -d 0; exit'
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   27066 chazelas    1w  FIFO   0,10      0t0 2586272 pipe 27067,sh,0r 27068,lsof,0r
sh      27067 chazelas    0r  FIFO   0,10      0t0 2586272 pipe 27066,sleep,1w

( lsof표준 입력에도 파이프가 있음을 확인하세요)

관련 정보