STDOUT에 어떤 프로세스가 작성되는지 확인하는 방법은 무엇입니까?


19

프로세스의 두 인스턴스가 실행 중입니다. 그중 하나는 "frEAkIng oUT!"입니다. STDOUT에 인쇄 오류가 멈추지 않습니다.

깨진 프로세스를 죽이고 싶지만 잘못된 프로세스를 종료하지 않아야합니다. 둘 다 거의 동시에 시작되었고 사용하면 top모두 동일한 양의 메모리와 CPU를 사용하는 것을 볼 수 있습니다. 어떤 프로세스가 제대로 작동하지 않는지 알 수없는 것 같습니다.

가장 안전한 방법은 STDOUT에 쓰는 프로세스 / pid를 파악하는 것입니다.

그렇게 할 방법이 있습니까?


1
stdout에 쓰는 것은 파일 디스크립터 1에 (문제의 프로세스 중) 터미널에 쓰는 것을 의미 /dev/null합니다. 대신 터미널 장치 나 로그 파일과 같은 특정 파일을 의미하지 않습니까?
Stéphane Chazelas

둘 다 동일한 쉘에서 시작된 경우 둘 다 STDOUT에 작성 중이므로이를 고정하면 둘 중 어느 것을 죽일지를 식별하는 데 도움이되지 않습니다. Jofel의 방법은 당신이 찾고있는 것일 것입니다.
slm

그가 실제로 의미하는 것은 어떤 것이 터미널에서 출력을 생성하고 있는지 입니다.
Barmar

답변:


17

Linux에서 쉘의 stdout이 연결된 것과 동일한 자원에 쓰고있는 내용을 알고 싶다면 다음을 수행 할 수 있습니다.

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

그것은 write()쉘의 fd 1과 같은 파일에서 적어도 하나의 파일 디스크립터가 열려있는 모든 프로세스 의 시스템 호출 (모든 파일 디스크립터에서)을 보고합니다 .


그것이 내가 처음에 생각했던 것입니다. 두 가지 방법 덕분에 두 가지 방법을 모두 시도 할 것입니다.
TCZ8

23

SIGSTOP (실제 PID로 pid1과 pid2를 대체 하거나 사용 killall및 어플리케이션 이름) 을 보내 두 처리를 중지 할 수 있습니다 .

kill -SIGSTOP pid1 pid2

터미널 (또는 표준 출력이 리디렉션되는 곳)의 인쇄가 중지되어야합니다. 그런 다음 중 하나를 사용하여 계속하십시오.

kill -SIGCONT pid1

오류 메시지가 즉시 나타나면 첫 번째 프로세스를 알고있는 것입니다. 그렇지 않으면 다시 중지하고 두 번째를 계속할 수 있습니다 ...

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

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


1
그것은 문제를 해결하는 아주 좋은 방법이지만 터미널에 누가 쓰고 있는지 추적하는 방법을 찾고있었습니다. 감사합니다
TCZ8

그냥이 질문을 다시 읽고 있었는데, 마지막 의견을 쓰는 동안 뇌 방귀가있는 것처럼 보입니다. 이것은 또한 내 문제를 해결합니다. 고마워.
TCZ8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.