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 top
puedo 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?
/dev/null
). ¿Estás seguro de que no te refieres a un archivo en particular (como un dispositivo terminal o un archivo de registro ...)?Respuestas:
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:
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.fuente
Puede detener ambos procesamientos enviándoles SIGSTOP (reemplace pid1 y pid2 por los PID reales o use
killall
y el nombre de la aplicación):La impresión en el terminal (o donde sea que se redireccione stdout) debería detenerse. Luego continúe uno de ellos usando
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-Z
y los controles de trabajo shell (fg %1
,bg %1
,kill %1
, ...).fuente