로깅 출력의 "프로세스 ID"를 표준 출력으로 가져오는 방법은 무엇입니까?

로깅 출력의 "프로세스 ID"를 표준 출력으로 가져오는 방법은 무엇입니까?

출력을 stdout으로 덤프하는 모든 프로세스의 PID를 얻는 방법.

답변1

모든 프로세스에는 표준 출력이 있으며 이에 쓸 수 있습니다. 표준 출력이 현재 터미널인 프로세스를 찾으려면 Linux에서 다음을 사용할 수 있습니다.

find -L /proc/[0-9]*/fd/1 -prune -samefile /dev/stdout

비슷한

find -L /proc/[0-9]*/fd/2 -prune -samefile /dev/stdout

표준 오류가 현재 터미널인 프로세스가 인식됩니다. 두 가지를 결합할 수 있습니다.

find -L /proc/[0-9]*/fd/[12] -prune -samefile /dev/stdout

그러나 이는 실제로 현재 터미널에 쓰고 있는지 여부를 알려주지 않습니다.

표준 출력에 기록된 모든 PID를 실제로 기록하려면 다음을 사용할 수 있습니다.bpftrace, 커널이 eBPF를 지원하는 경우(현재 많은 배포 커널이 eBPF를 지원합니다. 참조)커널 bpftrace요구 사항세부):

sudo bpftrace -e 'kprobe:ksys_write /comm != "bpftrace" && arg0 == 1/ { printf("PID %d writing to stdout\n", pid); }'

이는 자체 쓰기를 제외한 모든 쓰기를 표준 출력(파일 설명자 1) bpftrace에 기록합니다( bpftrace프로그램이 표준 출력에 쓰기 때문에 자체적으로 기록되기 때문에 종료됩니다).

답변2

다른 사람들과 달리 귀하의 질문은 별로 의미가 없다고 생각합니다. 아니면 오히려 귀하가 실수를 하신 것 같습니다.

매우 구체적으로 말하면 Stdout은 단지 파일 설명자 FD1입니다.

FD1이 열려 있는 모든 프로세스(즉, /proc/self/fd/1Linux)는 표준 출력에 쓸 수 있습니다.

이것이 정말로 당신이 알고 싶은 것입니까?

그렇다면 bftrace@Stephen Kitt의 예는 프로세스가 실제로 FD1에 쓰도록 하는 유일한 방법이지만 추적 필터가 실행되는 동안 쓰는 프로세스만 가능합니다.

괜찮다면 가능한 모든 작가라도 sudo lsof | egrep ' 1u| 1w'이 작업을 수행해야 합니다(그리고 더 큰 세트를 반환해야 합니다).

tty그러나 "현재" (아마도 터미널에 표시되는 내용)가 무엇인지 묻는다면 이는 완전히 다른 것입니다. 프로세스가 FD1을 닫더라도 tty를 다른 FD, 심지어 FD777901700에서도 열어 둘 수 있기 때문입니다. .

이 경우 문제가 있는 tty를 식별하고 필터링해야 합니다 sudo lsof | grep 'CHR' | grep '/dev/yourtty'.

관련 정보