Guardar la salida de" pantalla " (programa) en un archivo


Necesito guardar toda la salida de screen en un archivo para comprobar más tarde todo el contenido. La razón es que estoy descargando una memoria flash a través del puerto serie, usando la pantalla para interactuar con ella. Me gustaría guardarlo en un archivo para comprobar la estructura de la memoria.

He intentado:

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

Y también he intentado usar bufferfile desde la pantalla, pero no entiendo cómo usarlo.

¿Hay un camino fácil?

Author: Pete, 2013-01-08

9 answers

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

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

 80
Author: Fergie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-06 14:46:50

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

C-a H: Comienza/termina el registro de la ventana actual en el archivo "screenlog.y".

 84
Author: NeliJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-22 07:05:24

Para mac terminal:

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

Detalles

  • script construido en la aplicación para"hacer un typescript de la sesión de terminal"
  • -a añadir al archivo de salida
  • -t 0 el tiempo entre escribir en el archivo de salida es de 0 segundos, así que fuera.txt se actualiza para cada nuevo char
  • out.txt es solo el nombre del archivo de salida
  • screen /dev/ttyUSB0 115200 - comando desde la pregunta para conectarse a un dispositivo externo

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

Cola -100 fuera.txt

 9
Author: ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 04:50:01

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

Para múltiples sesiones de pantalla, esta es mi fórmula:

1) crear 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 quieres hacerlo "sobre la marcha", puedes cambiar logfile automáticamente. \012 significa "nueva línea", ya que usar \nlo imprimirá en el archivo de registro: fuente.

2) Inicie su comando con "- c " y " - L" banderas:

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

Eso es todo. Verás " prueba.log " después del primer color:

...
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 ]
...

Encontré que "-L" todavía es necesario incluso cuando "log on" está en el archivo de configuración.

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

* * EXTRA * *

En caso de que quieras hacerlo "sobre la marcha", puedes 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 set + x permisos:

./screen.sh TEST ./test.pl

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

 9
Author: lepe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-01 04:49:01

Ctrl+a entonces Mayús+H funciona para mí. Puede ver el archivo screenlog.0 mientras el programa todavía está en ejecución.

 5
Author: jaggedsoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-18 03:20:30

El siguiente comando funciona para la versión de pantalla 4.06.02

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

De la página man de la pantalla:

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

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

 5
Author: Nikhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-05 00:05:31

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

 4
Author: Ruben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-08 04:05:43

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

cat /dev/ttyUSB0

Usando lo anterior, puede hacer todas las re-direcciones que necesite. Por ejemplo, para volcar la salida a tu consola mientras guardas en tu archivo, debes hacer:

cat /dev/ttyUSB0 | tee console.log
 3
Author: Keo Malope,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 23:33:53

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

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

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

 0
Author: rkok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-13 08:48:50