Adjuntar a una salida de procesos para ver

111

¿Cómo 'adjunto' una vista de consola / terminal a la salida de una aplicación para poder ver lo que puede estar diciendo?

¿Cómo puedo separarme de la salida de una aplicación sin matarla?

Normalmente, si inicia una aplicación habladora usando la línea de comandos, puede ver todo tipo de resultados maravillosos. Sin embargo, digamos que tengo una programación particularmente habladora en ejecución, como KINO, y quiero ver su salida en cualquier momento sin reiniciarla a través de la línea de comandos. No puedo; al menos no sé cómo.

aggitan
fuente
1
¿Tiene el símbolo de depuración en su proceso? ¿Funciona en un entorno de producción? Y si es así, ¿es necesario que NUNCA se pause?
yves Baumes
Cuando tengo episodios de problemas de estabilidad con programas de usuario final como kino (se bloquea y mata mi sonido), quiero poder saber cómo / por qué se bloqueó para poder trabajar en solucionarlo. Este no es un programa que estoy desarrollando, sino una técnica que me gustaría conocer para solucionar problemas. Intentaré tu sugerencia a continuación.
aggitan

Respuestas:

17

Hay algunas opciones aquí. Una es redirigir la salida del comando a un archivo y luego usar 'tail' para ver las nuevas líneas que se agregan a ese archivo en tiempo real.

Otra opción es iniciar su programa dentro de la "pantalla", que es una especie de aplicación de Terminal basada en texto. Las sesiones de pantalla se pueden adjuntar y desconectar, pero nominalmente solo están destinadas a ser utilizadas por el mismo usuario, por lo que si desea compartirlas entre usuarios, es un gran dolor de cabeza.

Don Werve
fuente
1
"Hay algunas opciones aquí. Una es redirigir la salida del comando a un archivo y luego usar 'tail' para ver las nuevas líneas que se agregan a ese archivo en tiempo real". ¿Se puede hacer esto con aplicaciones que ya se están ejecutando?
aggitan
2
Probablemente necesite tail -f $ log_file para obtener el resultado tal como está escrito en el archivo. Además, no, no conozco ninguna forma de hacerlo con una aplicación que ya se esté ejecutando.
Varkhan
@aggitan: No. Para las aplicaciones existentes, tendrá que reiniciarlas, porque ya han vinculado su E / S al terminal de control.
Don Werve
288

Creo que tengo una solución más sencilla aquí. Simplemente busque un directorio cuyo nombre corresponda al PID que está buscando, en el pseudo-sistema de archivos accesible en la /procruta. Entonces, si tiene un programa en ejecución, cuyo ID es 1199, cden él:

$ cd /proc/1199

Luego busque el fddirectorio debajo

$ cd fd

Este fddirectorio contiene los objetos descriptores de archivo que está usando su programa (0: stdin, 1: stdout, 2: stderr) y solo tail -fel que necesita, en este caso, stdout):

$ tail -f 1
licorna
fuente
9
No pude usar, tailya que en mi caso la salida se redirigió a otro proceso para la entrada, pero moreme mostró los datos actuales.
Ωmega
10
¡Una de las publicaciones más fascinantes de este sitio!
robert
2
moreestá trabajando para mí. ubuntu 14.04 en un proceso de nodo
Shih-Min Lee
1
Esto no me funciona con un proceso java que llama a System.out.println. No hay ninguna salida en / proc / [pid] / fd / 1
Nick
1
Intenté crear una reproducción usando lo siguiente, pero fue en vano: `` docker run -it --name container1 ubuntu bash -c -i "COUNT = 0; while true; do echo Mantén el ritmo de la pista de baile; (( COUNT ++)); sleep 1; echo \ "El contador es: \ $ {COUNT} \"; hecho; " `` `En otra terminal:` `` docker exec -it container1 tail -f / proc / 1 / fd / 1 `` `
JacobWuzHere
54

Estaba buscando exactamente lo mismo y descubrí que puedes hacer:

strace -ewrite -p $PID

No es exactamente lo que necesitabas, pero está bastante cerca.

Probé la salida de redireccionamiento, pero eso no funcionó para mí. Quizás porque el proceso estaba escribiendo en un socket, no lo sé.

Paul Scheltema
fuente
gracias, funciona, pero la salida se trunca, por ejemplo, para ping: write (1, "64 bytes de 1.0.0.1: icmp_seq =" ..., 56) = 56
izy
8

¿Cómo 'adjunto' una vista de consola / terminal a la salida de una aplicación para poder ver lo que puede estar diciendo?

Sobre esta pregunta, sé que es posible captar el resultado, incluso cuando no se inició el comando sceen antes de iniciar el processus.

Aunque nunca lo probé, encontré un artículo interesante que explica cómo usar GDB (y sin reiniciar el proceso).

redireccionar la salida de un proceso en ejecución

Básicamente:

  1. Verifique la lista de archivos abiertos para su proceso, gracias a / proc / xxx / fd
  2. Adjuntar su proceso con GDB
  3. Mientras está en pausa, cierre el archivo que le interesa, llamando a la función close () (puede cualquier función de su proceso en GDB. Sospecho que necesita símbolos de depuración en su proceso ...)
  4. Abra un nuevo archivo llamando a la función create () o open (). (Eche un vistazo a los comentarios al final, verá que las personas sugieren usar dup2 () para asegurarse de que se use el mismo identificador)
  5. Separe el proceso y déjelo correr.

Por cierto, si está ejecutando un sistema operativo Linux en la caja i386, los comentarios hablan de una mejor herramienta para redirigir la salida a una nueva consola: 'retty' . Si es así, considere su uso.

yves baumes
fuente
6

Para mí, esto funcionó:

  1. Inicie sesión como propietario del proceso (incluso si rootse le niega el permiso)

    ~$ su - process_owner
    
  2. Siga el descriptor de archivo como se menciona en muchas otras respuestas.

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
Akki
fuente
2

Quería ver de forma remota un proceso de actualización de yum que se había ejecutado localmente, por lo que, si bien probablemente había formas más eficientes de hacer esto, esto es lo que hice:

watch cat /dev/vcsa1

Obviamente, querrá usar vcsa2, vcsa3, etc., dependiendo de qué terminal se esté usando.

Siempre que la ventana de mi terminal tuviera el mismo ancho que el terminal en el que se estaba ejecutando el comando, podía ver una instantánea de su salida actual cada dos segundos. Los otros comandos recomendados en otros lugares no funcionaron particularmente bien para mi situación, pero ese funcionó.

RedScourge
fuente