Guardar salida de pantalla (programa) en un archivo

130

Necesito guardar toda la salida de Screen en un archivo para verificar luego todo el contenido.

La razón es que estoy volcando una memoria flash a través de un puerto serie, usando Screen para interactuar con ella. Me gustaría guardarlo en un archivo para verificar la estructura de la memoria.

He intentado:

$: screen /dev/ttyUSB0 115200 >> foo.txt
$: screen /dev/ttyUSB0 115200 | tee foo.txt

Y también he tratado de usar el archivo buffer desde la pantalla, pero no entiendo cómo usarlo.

hay una manera fácil?

Edoardoo
fuente
La configuración de producción que estoy usando tiene múltiples instancias de pantalla. Aquel cuya salida necesito tiene una línea como 'pts / 10'. Por lo tanto, ¿qué debo hacer para obtener su salida a un archivo?
Sid

Respuestas:

129

Hay una opción de línea de comando para iniciar sesión. La salida se guarda en el archivo screenlog.n, donde n es un número de la pantalla. Desde las páginas man de la pantalla:

'-L' Indica a la pantalla que active el registro de salida automático para las ventanas.

Fergie
fuente
66
Gracias. ¿Hay alguna forma de mostrar qué pantalla ya tiene en su búfer de salida? Por ejemplo, olvidé habilitar el registro, pero la salida está disponible en el búfer de la pantalla de desplazamiento: ¿cómo escribir eso en un archivo?
Tagar
48
Simplemente busqué en Google un poco más. Aquí está la respuesta para mi comentario anterior: stackoverflow.com/questions/4807474/… Ctrl + A y: para acceder al modo de comando, luego copia en papel -h <nombre de archivo> en caso de que alguien más lo necesite.
Tagar
3
El archivo de registro se creará en el mismo directorio en el que ejecutó la pantalla.
lepe
1
Ayer hice una "pantalla -L", desconecté mi sesión SSH, me conecté nuevamente hoy y volví a conectar usando "pantalla -r" (solo tenía una), salí e hice una find / -name "screen*log"que no encontró nada.
pacoverflow
104

También puede usar Control-a + H para guardar registros en el archivo screenlog.n. Un Control-a + H más para apagar.

Ca H: Comienza / finaliza el registro de la ventana actual en el archivo "screenlog.n".

NeliJ
fuente
55
+1. Si no se puede crear el registro, intente cambiar el directorio de trabajo de la ventana de la pantalla: Ctrl- a+ :y escriba, por ejemplochdir /home/foobar/baz
Chriki el
2
Ca + H simplemente cambia las ventanas de la pantalla por mí. ¡Nada que ver con un archivo de registro!
aaa90210
2
@ aaa90210 Es ctrl-a seguido de una prensa separada de h para una copia impresa. ctrl-a seguido de una pulsación separada de shift-h inicia un archivo de registro completo.
James
1
¿Está buscando el archivo screenlog.0 creado por Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville
20

La respuesta seleccionada no funciona bastante bien con varias sesiones y no permite especificar un nombre de archivo de registro personalizado.

Para varias sesiones de pantalla, esta es mi fórmula:

  1. Cree un archivo de configuración para cada proceso:

    logfile test.log
    logfile flush 1
    log on
    logtstamp after 1
    logtstamp string "[ %t: %Y-%m-%d %c:%s ]\012"
    logtstamp on
    

    Si desea hacerlo "sobre la marcha", puede cambiarlo logfileautomáticamente. \012significa "nueva línea", ya que el uso \nlo imprimirá en el archivo de registro: fuente .

  2. Comience su comando con las banderas "-c" y "-L":

    screen -c ./test.conf -dmSL 'Test' ./test.pl
    

    Eso es. Verá "test.log" después de la primera descarga:

    ...
    6 Something is happening...
    [ test.pl: 2016-06-01 13:02:53 ]
    7 Something else...
    [ test.pl: 2016-06-01 13:02:54 ]
    8 Nothing here
    [ test.pl: 2016-06-01 13:02:55 ]
    9 Something is happening...
    [ test.pl: 2016-06-01 13:02:56 ]
    10 Something else...
    [ test.pl: 2016-06-01 13:02:57 ]
    11 Nothing here
    [ test.pl: 2016-06-01 13:02:58 ]
    ...
    

Descubrí que "-L" todavía es necesario incluso cuando "iniciar sesión" está en el archivo de configuración.

No pude encontrar una lista de las variables de formato de tiempo (como% m) utilizadas por la pantalla. Si tiene un enlace de esos formatos, publíquelo a continuación.

Extra

En caso de que quiera hacerlo "sobre la marcha", puede usar este script:

#!/bin/bash
if [[ $2 == "" ]]; then
    echo "Usage: $0 name command";
    exit 1;
fi
name=$1
command=$2
path="/var/log";
config="logfile ${path}/${name}.log
logfile flush 1
log on
logtstamp after 1
logtstamp string \"[ %t: %Y-%m-%d %c:%s ]\012\"
logtstamp on";
echo "$config" > /tmp/log.conf
screen -c /tmp/log.conf -dmSL "$name" $command
rm /tmp/log.conf

Para usarlo, guárdelo (screen.sh) y establezca permisos + x:

./screen.sh TEST ./test.pl

... y ejecutará ./test.pl y creará un archivo de registro en /var/log/TEST.log

lepe
fuente
1
Gracias, la on-the-flyparte es súper útil.
Ram RS
1
Seguimiento, una noche a la mañana de ejecución pantalla con un archivo de configuración creado y borrado sobre la marcha con error en una screen -rcon "Unable to open "/tmp/log.conf". Además, la pantalla pasó de [detached]estado a inexistente. ¿Cuál pudo haber sido el problema?
Ram RS
1
¿Qué hace tu comando? la pantalla volverá a crear el archivo de registro cuando falte, así que supongo que / tmp / se quedó sin espacio o ¿tuvo algún otro problema relacionado con el sistema operativo? Utilizo este enfoque en varios servidores que se ejecutan indefinidamente y hasta ahora no he visto tal situación en al menos 1 año. Si lo desea, podemos iniciar un chat y puedo ayudarlo a solucionar su problema.
lepe
1
Creo que tiene razón, que no debe terminar la pantalla si está ejecutando el proceso de esa manera, lo que es lo mismo que ejecutar: screen bash. Si algún otro proceso está matando su pantalla, debería aparecer como 'muerto', pero no desaparecerá. No estoy seguro de qué puede ser.
lepe
1
@ qräbnö: ¡Buena captura! Todo este tiempo y no me di cuenta. Actualicé la respuesta en consecuencia.
lepe
20

El siguiente comando funciona para Screen versión 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Desde la página de manual de Screen :

-Logfile file : By default logfile name is "screenlog.0".
                You can set new logfile name with the "-Logfile" option.

Puede verificar la versión existente de Screen usando screen -version . Puede descargar e instalar la última versión de la pantalla desde https://www.gnu.org/software/screen/ .

Nikhil
fuente
También puede dejar el command_to_be_executed como en blanco e ingresar una serie de trabajos de larga ejecución
devssh
Recuerde tener permisos de escritura en el directorio de trabajo de la pantalla, porque de lo contrario falla silenciosamente (simplemente no
inicia
15

Para el terminal Mac:

script -a -t 0 out.txt screen /dev/ttyUSB0 115200

Detalles

  • script: Una aplicación integrada para "hacer un mecanografiado de la sesión de terminal"
  • -a: Añadir al archivo de salida
  • -t 0: El tiempo entre la escritura en el archivo de salida es de 0 segundos, por lo que out.txt se actualiza para cada nuevo carácter
  • out.txt: Es solo el nombre del archivo de salida
  • screen /dev/ttyUSB0 115200: Comando de la pregunta para conectarse a un dispositivo externo

Luego puede usar tail para ver que el archivo se está actualizando.

tail -100 out.txt
Ryan
fuente
1
Esto no funcionó para mí en una Mac. El archivo de registro muestra el script que comienza con el comando común y el final del comando, pero no los datos recibidos del comando de pantalla.
David
10

Ctrl+AEntonces Shift+Hfunciona para mí. Puede ver el archivo screenlog.0mientras el programa aún se está ejecutando.

jaggedsoft
fuente
1
Ctrl + A y luego H.
Shimon Doodkin
1
@ShimonDoodkin Lo intenté, por alguna razón no funciona en Debian. Sin embargo, podría ser útil para otros. ¡Gracias!
jaggedsoft
5

El comando 'script' en Unix debería hacer el truco. Simplemente ejecútelo al comienzo de su nueva consola y debería ser bueno.

Rubén
fuente
¡Excelente! donde lo imprime
Edoardoo
Simplemente debería escribir en un archivo. El comando es un poco desordenado, pero creo que esto podría resolverlo un poco: linux.byexamples.com/archives/279/…
Ruben
5

Aquí hay un truco: ¡envuélvelo sh -c!

screen sh -c './some-script 2>&1 | tee mylog.log'

Donde 2>&1redirige stderr a stdout para que teepueda capturar y registrar mensajes de error.

rkok
fuente
5

Lo siguiente podría ser útil (probado en: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Usando lo anterior, puede hacer todas las redirecciones que necesita. Por ejemplo, para volcar la salida en su consola mientras la guarda en su archivo, haría:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
fuente
Este me funcionó perfectamente. Estoy registrando la salida del monitor en serie de una sesión de captura de datos de Arduino.
Ian Pitts
3

Una respuesta diferente si necesita guardar la salida de su búfer de desplazamiento completo desde una pantalla que ya se está ejecutando activamente:

Ctrl-a [ g SPACE G $ >.

Esto guardará todo tu búfer en / tmp / screen-exchange

rkelleycook
fuente
2

El registro de pantalla existente se puede guardar mediante:

Ctrl+A : hardcopy -h filename

Ratan Raj
fuente