¿Cómo averiguar qué proceso está escribiendo en STDOUT?

19

Tengo dos instancias de un proceso en ejecución. Uno de ellos es "¡EXPERTO!" e imprimir errores sin parar a STDOUT.

Quiero matar el proceso roto pero tengo que asegurarme de no terminar el proceso incorrecto. Ambos comenzaron aproximadamente al mismo tiempo y toppuedo ver que ambos usan aproximadamente la misma cantidad de memoria y CPU. Parece que no puedo encontrar nada que indique qué proceso se está comportando mal.

Lo más seguro sería averiguar qué proceso / pid está escribiendo en STDOUT.

¿Hay alguna forma de hacer eso?

TCZ8
fuente
1
Escribir en stdout significaría escribir en su descriptor de archivo 1 ((del proceso en cuestión) que puede ser como un terminal o /dev/null). ¿Estás seguro de que no te refieres a un archivo en particular (como un dispositivo terminal o un archivo de registro ...)?
Stéphane Chazelas
Si ambos comenzaron en el mismo caparazón, ambos están escribiendo en STDOUT, por lo que anclar esto no lo ayudará a identificar cuál de los 2 matar. El método de Jofel es probablemente lo que estás buscando.
slm
Lo que realmente quiere decir es cuál está produciendo salida en el terminal .
Barmar

Respuestas:

17

En Linux, suponiendo que desea saber qué está escribiendo en el mismo recurso al que está conectado el stdout de su shell, puede hacer lo siguiente:

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

Eso informaría las write()llamadas al sistema (en cualquier descriptor de archivo) de cada proceso que tenga al menos un descriptor de archivo abierto en el mismo archivo que fd 1 de su shell.

Stéphane Chazelas
fuente
Eso es lo que tenía en mente inicialmente, probaré ambos métodos gracias a los dos.
TCZ8
23

Puede detener ambos procesamientos enviándoles SIGSTOP (reemplace pid1 y pid2 por los PID reales o use killally el nombre de la aplicación):

kill -SIGSTOP pid1 pid2

La impresión en el terminal (o donde sea que se redireccione stdout) debería detenerse. Luego continúe uno de ellos usando

kill -SIGCONT pid1

Si los mensajes de error aparecen inmediatamente, sabe que es el primer proceso. Si no, puede detenerlo nuevamente y continuar con el segundo ...

Antes de matar un proceso detenido, es una buena práctica enviar primero SIGCONT.

La misma técnica se puede utilizar con Ctrl-Zy los controles de trabajo shell ( fg %1, bg %1, kill %1, ...).

jofel
fuente
1
Esa es una muy buena manera de solucionarlo, pero realmente estaba buscando una forma de rastrear quién está escribiendo en la terminal. Gracias
TCZ8
Estaba releyendo esta pregunta, parece que tuve un pedo cerebral mientras escribía mi último comentario. Esto también solucionaría mi problema. Gracias.
TCZ8