Come scoprire quale processo sta scrivendo su STDOUT?


19

Ho due istanze di un processo in esecuzione. Uno di questi è "frEAkIng oUT!" e errori di stampa non stop a STDOUT.

Voglio interrompere il processo interrotto, ma devo assicurarmi di non interrompere quello sbagliato. Entrambi sono stati avviati contemporaneamente e usando topVedo che entrambi utilizzano circa la stessa quantità di memoria e CPU. Non riesco a trovare nulla che indichi a quale processo si sta comportando male.

La cosa più sicura sarebbe capire quale processo / pid sta scrivendo a STDOUT.

C'è un modo per farlo?


1
Scrivere su stdout significherebbe scrivere sul suo descrittore di file 1 ((del processo in questione) che può essere qualcosa di simile a un terminale o /dev/null). Sei sicuro di non voler dire un particolare file (come un dispositivo terminale o un file di registro ...)?
Stéphane Chazelas,

Se entrambi sono stati avviati nella stessa shell, entrambi stanno scrivendo su STDOUT, quindi bloccare questo non ti aiuterà a identificare quale dei 2 uccidere. Il metodo di Jofel è probabilmente quello che stai cercando.
slm

Quello che intende veramente è quale produce output sul terminale .
Barmar,

Risposte:


17

Su Linux, supponendo che tu voglia sapere cosa sta scrivendo sulla stessa risorsa a cui è collegato lo stdout della shell, puoi fare:

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

Ciò segnalerebbe le write()chiamate di sistema (su qualsiasi descrittore di file) di ogni processo che ha almeno un descrittore di file aperto sullo stesso file di fd 1 della shell.


Questo è quello che avevo in mente inizialmente, proverò entrambi i metodi grazie a entrambi.
TCZ8,

23

È possibile interrompere entrambe le elaborazioni inviandole SIGSTOP (sostituire pid1 e pid2 con i PID effettivi o utilizzare killalle il nome dell'applicazione):

kill -SIGSTOP pid1 pid2

La stampa sul terminale (o ovunque venga reindirizzato stdout) dovrebbe interrompersi. Quindi continua uno di loro usando

kill -SIGCONT pid1

Se i messaggi di errore compaiono immediatamente, sai che è il primo processo. Altrimenti puoi fermarlo di nuovo e continuare il secondo ...

Prima di interrompere un processo interrotto, è buona norma inviare prima SIGCONT.

La stessa tecnica può essere utilizzata con Ctrl-Zei comandi shell lavoro ( fg %1, bg %1, kill %1, ...).


1
Questo è un ottimo modo per risolvere il problema, ma stavo davvero cercando un modo per rintracciare chi sta scrivendo sul terminale. Grazie
TCZ8,

Stavo solo rileggendo questa domanda, sembra che ho avuto una scoreggia cerebrale mentre scrivevo il mio ultimo commento. Ciò risolverebbe anche il mio problema. Grazie.
TCZ8,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.