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?
/dev/null
). Tem certeza de que não quer dizer um arquivo específico (como um dispositivo terminal ou um arquivo de log ...)?Respostas:
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:
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.fonte
Você pode interromper o processamento enviando-lhes SIGSTOP (substitua pid1 e pid2 pelos PIDs reais ou use
killall
e o nome do aplicativo):A impressão no terminal (ou para onde o stdout é redirecionado) deve parar. Então continue um deles usando
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-Z
e os controles de trabalho shell (fg %1
,bg %1
,kill %1
, ...).fonte