2009-04-03 23 views
72

¿Cómo podría 'adjuntar' una consola/terminal-vista a una salida de aplicaciones para que pueda ver lo que puede estar diciendo?Adjuntar a una salida de procesos para ver

¿Cómo me desconectaría de una salida de aplicaciones sin matar la aplicación?

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

+1

¿Tiene el símbolo de depuración en su proceso? ¿Funciona en entorno de producción? Y si es así, ¿necesita que NUNCA haya estado en pausa? –

+0

Cuando tengo episodios de problemas de estabilidad con programas de usuario final como kino (bloquea y mata mi sonido), quiero saber cómo y por qué se colgó para poder solucionarlo. Este no es un programa que estoy desarrollando sino una técnica que me gustaría saber para solucionar problemas. Voy a probar tu sugerencia a continuación. – aggitan

Respuesta

6

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

Otra opción es ejecutar su programa dentro de 'pantalla', que es una especie de aplicación de terminal basada en texto. Las sesiones de pantalla se pueden adjuntar y separar, pero están destinadas solo para ser utilizadas por el mismo usuario, por lo que si desea compartirlas entre usuarios, es un gran dolor en el culo.

+0

"Aquí hay algunas opciones: una es redirigir la salida del comando a un archivo y luego usar 'cola' para ver las nuevas líneas que se agregan a ese archivo en tiempo real". ¿Se puede hacer esto con las 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 hay manera de que sepa hacer eso con una aplicación que ya se está ejecutando. – Varkhan

+0

@aggitan: No. Para las aplicaciones existentes, tendrá que reiniciarlas, porque ya han vinculado sus E/S al terminal de control. –

4

¿Cómo Me adjuntar ' una consola/terminal de visión a una salida aplicaciones para que pueda ver lo que se puede decir?

Acerca de esta pregunta, sé que es posible capturar la salida, incluso cuando no se inició el comando sceen antes de iniciar el proceso.

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

redirecting-output-from-a-running-process

Básicamente:

  1. comprobar la lista de archivos abiertos para su proceso, gracias a /proc/xxx/fd
  2. Acople su proceso con el BGF
  3. Mientras está en pausa, cierre el archivo que le interese, llamando al close() función (usted puede cualquier función de su proceso en GDB. Sospecho que necesita símbolos de depuración en su proceso ...)
  4. Abra el nuevo archivo llamando a la función create() o open(). (Tenga una mirada en los comentarios al final, podrás ver personas sugieren usar dup2() para garantizar el mismo mango estará en uso)
  5. Separar el proceso y dejar en funcionamiento.

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

28

que estaba buscando exactamente lo mismo, y encontraron que se puede hacer:

strace -ewrite -p $PID 

no es exactamente lo que necesitaba, pero es bastante estrecha

probé la salida de redireccionamiento, pero que no funcionó para mí, maby porque el proceso estaba escribiendo en un socket, no sé

+0

comando muy útil, gracias. – lenhhoxung

177

Creo que aquí tengo una solución más simple, solo busque un directorio cuyo nombre corresponda al PID que está buscando, bajo el pseudo-sistema de archivos acceso accesible der la ruta /proc. Así que si usted tiene un programa en ejecución, cuyo ID es 1199, cd en él:

$ cd /proc/1199 

A continuación, busque el directorio fd debajo

$ cd fd 

Este directorio fd contener el archivo de descriptores de objetos que su programa está utilizando (0: la entrada estándar, 1: salida estándar, 2: stderr) y justo tail -f el que necesita - en este caso, la salida estándar):

$ tail -f 1 
+8

No pude usar 'tail' ya que en mi caso la salida se redirigió a otro proceso para la entrada, pero' more' me mostró los datos actuales. –

+0

@ Ωmega - ¿No podría encontrar el proceso en el que lo está redirigiendo, y luego rastrearlo es stdin (/ proc/#/0)? –

+0

En mi entorno, en realidad 'tail' no funcionaba en ningún escenario, solo' head' y 'more' ... –

0

me querían de forma remota ver un proceso de actualización de yum que había sido gestionado localmente, así que mientras había maneras probablemente más eficientes de hacer esto, esto es lo que hice:

reloj cat/dev/vcsa1

Obviamente te gustaría utilizar vcsa2 , vcsa3, etc., dependiendo de qué terminal se estaba utilizando.

siempre que mi ventana de terminal fuera del mismo ancho que la terminal en la que se estaba ejecutando el comando, podría ver una instantánea de su salida actual cada 2 segundos. Los otros comandos recomendados en otros lugares no funcionaron particularmente bien para mi situación, pero ese fue el truco.

Cuestiones relacionadas