어떤 프로세스가 STDOUT에 쓰고 있는지 확인하는 방법은 무엇입니까?

어떤 프로세스가 STDOUT에 쓰고 있는지 확인하는 방법은 무엇입니까?

두 개의 실행 중인 프로세스 인스턴스가 있습니다. 그 중 하나는 "놀랍다!"고 간헐적으로 STDOUT에 오류를 인쇄하는 것입니다.

손상된 프로세스를 종료하고 싶지만 잘못된 프로세스를 종료하지 않도록 해야 합니다. 그들은 거의 같은 시간에 시작하며, 사용하면 top둘 다 거의 같은 양의 메모리와 CPU를 사용하는 것을 알 수 있습니다. 어떤 프로세스가 제대로 수행되지 않았는지 나타내는 정보를 찾을 수 없는 것 같습니다.

가장 안전한 방법은 어떤 프로세스/pid가 STDOUT에 쓰고 있는지 알아내는 것입니다.

이를 수행할 수 있는 방법이 있습니까?

답변1

SIGSTOP을 전송하여 두 프로세스를 모두 중지할 수 있습니다(pid1 및 pid2를 실제PID또는 용도 killall및 애플리케이션 이름):

kill -SIGSTOP pid1 pid2

터미널(또는 stdout이 리디렉션되는 곳)에서의 인쇄가 중지되어야 합니다. 그럼 다음 중 하나를 사용해 보세요.

kill -SIGCONT pid1

오류 메시지가 즉시 나타나면 이것이 첫 번째 프로세스라는 것을 알 수 있습니다. 그렇지 않다면 다시 멈추고 두 번째 작업을 계속할 수 있습니다.

중지된 프로세스를 종료하기 전에 SIGCONT를 보내는 것이 좋습니다.

Ctrl-Z쉘 작업 제어( fg %1, bg %1, kill %1, ...) 에도 동일한 기술을 사용할 수 있습니다 .

답변2

Linux에서는 쉘의 stdout이 연결된 동일한 리소스에 무엇이 기록되고 있는지 알고 싶다고 가정하면 다음과 같이 할 수 있습니다.

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

write()이는 쉘의 fd 1과 동일한 파일에 최소한 하나의 파일 설명자가 열려 있는 모든 프로세스에 대한 시스템 호출(모든 파일 설명자에 대해)을 보고합니다 .

관련 정보