Como descobrir qual processo está sendo gravado no STDOUT?

18

Eu tenho duas instâncias de um processo em execução. Um deles é "freakk oUT!" e erros de impressão não param para STDOUT.

Eu quero matar o processo quebrado, mas tenho que me certificar de não terminar o processo errado. Ambos foram iniciados ao mesmo tempo e usando top eu posso ver que ambos usam aproximadamente a mesma quantidade de memória e CPU. Não consigo encontrar nada que aponte para qual processo está se comportando mal.

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

Existe alguma maneira de fazer isso?

    
por TCZ8 02.07.2014 / 15:06

2 respostas

13

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

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

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

    
por 02.07.2014 / 16:00
22

Você pode interromper o processamento enviando-os SIGSTOP (substitua pid1 e pid2 pelos PIDs reais ou use killall e o nome da aplicação):

kill -SIGSTOP pid1 pid2

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

kill -SIGCONT pid1

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

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

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

    
por 02.07.2014 / 15:22