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.