프로세스 간 파이프 트래픽 모니터링


13

이름없는 파이프를 통해 통신하는 두 개의 Linux 프로세스가 있습니다. 파이프의 트래픽을 어떻게 모니터링 할 수 있습니까? 파이프에 데이터를 어떻게 주입합니까? 루트 액세스 권한이 있으며 파이프 inode를 알고 있습니다.

답변:


7

이름없는 파이프는 기본적으로 파일 디스크립터가있는 애플리케이션 전용입니다. 파이프의 트래픽을 관찰하거나 수정하는 원칙적인 방법은 없습니다. 나는 리눅스에서 파이프를 직접 볼 수있는 방법이 없다고 생각합니다.

ptrace 시스템 호출을 통해 당신이 겪고있는 일을 어느 정도 수행 할 수있는 확실한 방법이 있습니다 . 파이프 자체를 다루지 않고 프로세스 중 하나를 택할 것입니다. 관찰, 사용을 위해 strace를 , 예를 들어,

strace -p1234 -s99999 -e write

여기서 1234파이프에 쓰는 프로세스의 프로세스 ID입니다. 데이터 수정은 어렵지만 수행 할 수 있습니다. 가장 쉬운 방법은 표준 입력을 표준 출력에 복사하는 중간 프로세스와 주입하려는 데이터 (및 제외하려는 데이터 제외)를 먼저 설정하는 것입니다. 두 개의 명명 된 파이프를 작성하고 한 파이프에서는 stdin을 사용하고 다른 파이프에서는 stdout을 사용하여 중간 프로세스를 시작하십시오. 그런 다음 디버거 (예 : GDB )를 사용하여 두 대상 프로세스를 모두 open해당 명명 된 파이프에서 실행 한 다음 dup적절한 파일 설명자에 파이프를 배치하십시오. 프로세스에서 프로세스 중 하나가 중단 될 수 있습니다.

(마지막 단락을 이해하지 못하면 죄송하지만 특정 수준의 기술이 필요합니다. 더 쉬운 방법은 없다고 생각합니다.)


고마워요 실제로 시도한 것은 / proc / $ PID / fd로 이동하는 것입니다. 여기에서 프로세스 중 하나의 명명되지 않은 파이프에 대한 파일 항목을 찾았으며 쉘에서 간단한 cat 및 echo를 사용하여 데이터를 읽고 관리했지만 다소 동작 일관성이 없습니다. 추가 조사가 필요합니다.
jackhab

1
@ jackhab : 오, 파이프가 작동하지 않는다고 생각했습니다. 그러나 알 수 있듯이 생산자의 각 바이트는 정확히 하나의 소비자로 이동하여 모니터 또는 실제 소비자가 얻을 수 있는지 여부를 제어 할 수 없기 때문에 트래픽 모니터링에 큰 도움이되지 않습니다. 그런 다음 데이터를 주입 할 수 있어야합니다.
Gilles 'SO- 악마 그만해'12

2

파이프 모니터링에 유용한 일부 도구 :

파이프 뷰어

배관을 제어하지 않는 이미 실행중인 프로그램에 대해서는 gdb 방법 :
실행중인 프로세스에서 출력 방향 재 지정을 참조하십시오 .

또는 strace 를 사용할 수 있습니다 .

strace -ewrite -p $PID 2>&1 | grep "write(1"

설명자 1 호출 만 표시합니다. "2> & 1"은 기본적으로 strace가 stderr에 기록하므로 stderr을 stdout으로 리디렉션합니다.


1
내가 의미하는 것은 이미 실행중인 프로세스의 파이프에 도청하는 것입니다. 프로세스 A는 프로세스 B를 시작하고 파이프를 통해 프로세스 B와 대화하므로 tee 또는 pv와 같은 프록시 유틸리티를 사용할 수 없습니다.
jackhab

더 많은 방법을 추가했습니다.
harrymc

grep을 사용하는 대신 "-e write = 1"을 지정하여 출력을 fd 1에 기록 된 데이터로 제한 할 수 있습니다.
William Pursell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.