두 프로세스가 파이프를 통해 연결되면,
> 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
위의 내용은 fd
0 of sh
가 파이프이고 sleep
다른 쪽 끝이 fd 1 of임을 나타냅니다. fd를 다음 -E
과 같이 변경하면 +E
fd에 대한 완전한 정보를 얻을 수도 있습니다 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
표준 입력에도 파이프가 있음을 확인하세요)