Capturar salida de un programa ya iniciado

Imagen de palexi
0 puntos

Buenas,
llevo días intentando encontrar una manera de capturar la salida por línea de comandos de un programa ya iniciado. Me explico. Cuando se lanza un programa simplemente aparece por el terminal la salida de dicha aplicación, y se podría redirigir a un fichero o lo que sea. Debido a varias cuestiones no puedo hacer una redirección a fichero, y como el programa se inicia automáticamente tampoco puedo ver su salida. Lo he intentado mirando en /dev a ver si encontraba algún sitio donde se estuviera redirigiendo la salida estándar, pero no he encontrado nada. Una solución sería usar el strace, pero sale mucha más información de la necesaria, y por cuestiones que no voy a explicar por no alargar esto, no puedo capturar tanta información. Espero haberme explicado. Gracias!

Imagen de selerto
+1
0
-1

Hola amigo.

«Espero haberme explicado» Pues no mucho.

Quieres capturar la salida por línea de comandos de un programa que no tiene salida por la línea de comandos, y del que no sabes por donde tiene la salida.

Dices que se inicia automáticamente... ¿Es un demonio? si lo es, la salida estándar suele ser un archivo log.

+1
0
-1
Imagen de palexi
+1
0
-1

A ver si ahora consigo explicarme mejor dando más detalles. Se trata de un sistema embebido, un ARM9, con conexión ETH. Evidentemente no tiene monitor ni entorno gráfico ni nada que se le parezca. La forma de controlarlo es por SSH. Dentro tiene una aplicación que su salida, a base de "printf", deberían salir por consola. Si la aplicación se inicia desde la sesión SSH, todos los mensajes se reciben a través del terminal. Hasta aquí sin problemas. El problema es que al tratarse de un equipo autónomo, la aplicación se inicia automáticamente al encenderse el equipo, y cuando voy a los 3 días quiero saber qué es lo que está sacando por pantalla en ese momento. Como no se ha iniciado la aplicación desde la sesión desde SSH, cuando me conecto no sale (ni debería salir) nada por pantalla. No puedo hacer un log a un fichero porque es un sistema embebido con una memoria flash, que tiene el problema de estar limitada en capacidad y en número de escrituras. Lo que busco básicamente es que cuando me conecto por SSH, la salida de los printf, que en principio se están yendo al limbo, se me redirijan hacia la sesión SSH.
Espero que ahora quede más claro. Muchas gracias!!

+1
0
-1

--------------------------------
Linux, porque yo lo valgo

Imagen de osculodejudas
+1
0
-1

Puedes intentar una cosa, y es conectarte desde una consola remotamente, y redirigir el log a esa consola.
Por ejemplo:
ssh $USER1@$MAQUI "grep $FRASE /opt/dir/build.log|grep ASSET" >$logs/y

+1
0
-1
Imagen de palexi
+1
0
-1

No termino de entender tu comando. El directorio ese no existe, y no creo que se metiera ahí ningún log porque el opt está en disco, y lo llenaría en nada. Te importaría explicármelo un poco? Gracias!

+1
0
-1

--------------------------------
Linux, porque yo lo valgo

Imagen de osculodejudas
+1
0
-1

ssh $USER1@$MAQUI "grep $FRASE /opt/dir/build.log|grep ASSET" >$logs/y

ssh para conectar usuario@maquina, con el grep buscas una frase en un camino, y dentro de esa frase por ejemplo buscas ASSET y el resultado lo vas metiendo en un fichero.

Como sabras $LOQUESEA es una variable, y te puede ser muy util si quieres hacerlo dentro de un script

+1
0
-1
Imagen de cousteau
+1
0
-1

Se me ocurre que, en vez de guardar un log del programa, podrías hacer que cada vez que se vaya a mostrar un mensaje, se abra un archivo para escritura, se escriba el mensaje en el archivo y se cierre el archivo. Es decir, el archivo nunca tendrá más de 1 mensaje de error.

Para leer la salida del programa, haz desde terminal (ssh o lo que sea):

tail -f salida.log 2>/dev/null

y pulsa Ctrl-C cuando te canses.

El archivo puede ir en RAM, en /dev/shm, por ejemplo, si quieres evitar guardar en disco.

+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.
Imagen de palexi
+1
0
-1

Pero para eso tendría que lanzar el programa desde mi conexión ssh, no? O no te he entendido bien?

+1
0
-1

--------------------------------
Linux, porque yo lo valgo

Imagen de cousteau
+1
0
-1

No; el programa lo puede lanzar el sistema embebido, y en vez de escribir los mensajes en la salida estándar, los escribe en un archivo. Luego te conectas por ssh y lees el archivo con el comando que te he dicho (tail -f salida.log 2>/dev/null).

Ese comando sólo muestra incrementalmente los cambios en el archivo, así que en vez de escribir mensajes al final del archivo (lo que resultaría en un archivo muy grande), puedes sobreescribir el archivo entero cada vez, sustituyendo el mensaje antiguo por el nuevo.

+1
0
-1

«E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem» significa que dpkg se ha interrumpido y que tienes que ejecutar "sudo dpkg --configure -a" para corregir el problema.