¿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?


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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.