stdout에 대한 strace 쓰기 호출

stdout에 대한 strace 쓰기 호출

strace를 사용하여 프로세스의 표준 출력을 표시하는 방법이 있습니까? 나도 할 수 있다는 걸 알아

strace -p pid -e write

그러나 이는 여러 파일 설명자에 대한 write(2) 호출을 보여줍니다. 매뉴얼 페이지를 읽을 때 해당 -e write=옵션도 볼 수 있지만, 이를 사용하면 다른 많은 내용을 얻게 됩니다.

strace -p pid -e write=1

기본적으로 첫 번째 명령( )의 출력을 원 strace -p pid -e write하지만 write(1,...출력만 원합니다. 출력을 필터링할 수 있다는 것을 알고 있지만 strace가 이 작업을 직접 수행할 수 있는 방법이 있는지 궁금합니다.

답변1

PID를 알고 있는 경우 -P매개변수를 /proc의 STDOUT 파일 설명자에 연결할 수 있습니다. 이와 같이:

strace -p PID -P /proc/PID/fd/1 -e write

/proc/PID/fd에서 프로세스에 대해 열려 있는 모든 파일 설명자를 찾을 수 있습니다. 1은 STDOUT 파일에 대한 심볼릭 링크입니다.

답변2

파일 설명자 경로를 알고 있으면 strace매개변수를 사용하여 출력을 필터링할 수 있습니다.-P

~에 따르면문서:

-y 파일 설명자 인수와 연관된 경로를 인쇄합니다.

-P path는 경로에 액세스하는 시스템 호출만 추적합니다. 여러 -P 옵션을 사용하여 여러 경로를 지정할 수 있습니다.

-y를 사용할 때에는 반드시 사용할 필요는 없습니다 -P. 이를 사용하여 -y처음에 파일 설명자의 경로를 찾을 수 있습니다. 이것은 이와 같은 것일 수 있습니다 /dev/pts/0.

disown다음 명령을 사용하여 bash에서 연결이 끊긴 프로세스의 출력을 표시하는 데 사용할 수 있는 예는 다음과 같습니다 .

strace -e trace=write -s 1000 -p12345 -P "/dev/pts/0 (deleted)" 2>&1 | awk -F "\"" '{print $2}'

12345이 예에서는 세션에서 시작되어 원래 기록된 프로세스의 PID 입니다 . 프로세스 연결을 끊고 bash를 닫았습니다. 위 명령을 사용하면 다양한 bash 세션에서 프로세스의 출력을 표시할 수 있습니다.bashstdoutbashdisown 12345

답변3

아니요. 그러나 어쩌면 pid를 사용하는 대신 strace단순히 pid의 stdout을 모니터링 tail -f /proc/<pid>/fd/1함으로써 목표를 달성 할 수도 있습니다.

예:

$ for F in $(seq 1 100);do echo $F;sleep 1;done >/tmp/foo 2>&1 &
[1] 163
$ tail -f /proc/163/fd/1
4
5
6
7
8
9
^C
$

답변4

도구를 썼는데,무한 궤도, 이 작업을 수행합니다. 그래서 당신은 할 수 있습니다 catp $PID.

기본적으로는 뒤에서 strace사용되는 것과 동일 합니다. ptrace다양한 추적 정보를 인쇄하는 대신 추적된 출력을 표준 출력으로 인쇄합니다.

관련 정보