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?


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.


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, ...).


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.