Como descobrir qual processo está gravando no STDOUT?

19

Eu tenho duas instâncias de um processo em execução. Um deles é "sair de lá!" e erros de impressão sem parar para STDOUT.

Quero matar o processo interrompido, mas tenho que garantir que não encerre o processo errado. Ambos foram iniciados ao mesmo tempo e, usando top, posso ver que ambos usam a mesma quantidade de memória e CPU. Parece que não consigo encontrar nada que indique qual processo está se comportando mal.

O mais seguro seria descobrir qual processo / pid está gravando no STDOUT.

Existe alguma maneira de fazer isso?

TCZ8
fonte
1
Escrever no stdout significaria escrever no seu descritor de arquivo 1 ((do processo em questão) que pode ser algo como um terminal ou /dev/null). Tem certeza de que não quer dizer um arquivo específico (como um dispositivo terminal ou um arquivo de log ...)?
Stéphane Chazelas
Se eles foram iniciados no mesmo shell, então ambos estão escrevendo para STDOUT, portanto, fixar isso não ajudará a identificar qual dos dois matar. O método de Jofel é provavelmente o que você está procurando.
Slm
O que ele realmente quer dizer é qual deles está produzindo saída no terminal .
Barmar

Respostas:

17

No Linux, supondo que você queira saber o que está gravando no mesmo recurso ao qual o stdout do seu shell está conectado, você pode:

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

Isso reportaria as write()chamadas do sistema (em qualquer descritor de arquivo) de todo processo que tenha pelo menos um descritor de arquivo aberto no mesmo arquivo que o fd 1 do seu shell.

Stéphane Chazelas
fonte
Isso é o que eu tinha em mente inicialmente, vou tentar os dois métodos graças a vocês dois.
TCZ8
23

Você pode interromper o processamento enviando-lhes SIGSTOP (substitua pid1 e pid2 pelos PIDs reais ou use killalle o nome do aplicativo):

kill -SIGSTOP pid1 pid2

A impressão no terminal (ou para onde o stdout é redirecionado) deve parar. Então continue um deles usando

kill -SIGCONT pid1

Se as mensagens de erro aparecerem imediatamente, você sabe que é o primeiro processo. Caso contrário, você pode pará-lo novamente e continuar o segundo ...

Antes de interromper um processo parado, é uma boa prática enviar o primeiro SIGCONT.

A mesma técnica pode ser utilizada com Ctrl-Ze os controles de trabalho shell ( fg %1, bg %1, kill %1, ...).

jofel
fonte
1
Essa é uma maneira muito boa de solucionar problemas, mas eu realmente estava procurando uma maneira de rastrear quem está gravando no terminal. Obrigado
TCZ8
Só estava relendo essa pergunta, parece que eu tive um peido cerebral enquanto escrevia meu último comentário. Isso também resolveria o meu problema. THX.
TCZ8