출력을 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/1
Linux)는 표준 출력에 쓸 수 있습니다.
이것이 정말로 당신이 알고 싶은 것입니까?
그렇다면 bftrace
@Stephen Kitt의 예는 프로세스가 실제로 FD1에 쓰도록 하는 유일한 방법이지만 추적 필터가 실행되는 동안 쓰는 프로세스만 가능합니다.
괜찮다면 가능한 모든 작가라도 sudo lsof | egrep ' 1u| 1w'
이 작업을 수행해야 합니다(그리고 더 큰 세트를 반환해야 합니다).
tty
그러나 "현재" (아마도 터미널에 표시되는 내용)가 무엇인지 묻는다면 이는 완전히 다른 것입니다. 프로세스가 FD1을 닫더라도 tty를 다른 FD, 심지어 FD777901700에서도 열어 둘 수 있기 때문입니다. .
이 경우 문제가 있는 tty를 식별하고 필터링해야 합니다 sudo lsof | grep 'CHR' | grep '/dev/yourtty'
.