Enregistrer la sortie de l'écran (programme) dans un fichier

130

Je dois enregistrer toute la sortie de Screen dans un fichier pour vérifier plus tard tout le contenu.

La raison est que je vide une mémoire flash via un port série, en utilisant Screen pour l'interface avec elle. Je voudrais l'enregistrer dans un fichier pour vérifier la structure de la mémoire.

J'ai essayé:

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

Et j'ai également essayé d'utiliser bufferfile à partir de l'écran, mais je ne comprends pas comment l'utiliser.

Y a-t-il un moyen simple?

Edoardoo
la source
Le paramètre de production que j'utilise comporte plusieurs instances d'écran. Celui dont j'ai besoin en sortie a la ligne «pts / 10». Par conséquent, que dois-je faire pour obtenir sa sortie dans un fichier?
Sid

Réponses:

129

Il existe une option de ligne de commande pour la journalisation. La sortie est enregistrée dans le fichier screenlog.n, où n est un numéro de l'écran. À partir des pages de manuel de l'écran:

'-L' Indique à l'écran d'activer la journalisation automatique des sorties pour les fenêtres.

Fergie
la source
6
Merci. Existe-t-il un moyen de sortir ce que l'écran a déjà dans sa mémoire tampon de sortie? Par exemple, j'ai oublié d'activer la journalisation, mais la sortie est disponible dans la mémoire tampon de l'écran de défilement - comment écrire cela dans un fichier?
Tagar le
48
Juste googlé un peu plus .. Voici la réponse à mon commentaire précédent - stackoverflow.com/questions/4807474/… Ctrl + A et: pour passer en mode commande, alors copie papier -h <filename> au cas où quelqu'un d'autre en aurait besoin.
Tagar
3
Le fichier journal sera créé dans le même répertoire dans lequel vous avez exécuté screen.
lepe
1
Hier, j'ai fait un "screen -L", déconnecté ma session SSH, me suis reconnecté aujourd'hui et re-connecté en utilisant "screen -r" (je n'en avais qu'un), suis sorti et j'ai fait un find / -name "screen*log"qui n'a rien trouvé.
pacoverflow
104

Vous pouvez également utiliser Control-a + H pour enregistrer les enregistrements dans le fichier screenlog.n. Encore un Control-a + H à désactiver.

Ca H: Commence / termine l'enregistrement de la fenêtre courante dans le fichier "screenlog.n".

NeliJ
la source
5
+1. Si le journal ne peut pas être créé, essayez de changer le répertoire de travail de la fenêtre d'écran: Ctrl- a+ :et tapez par exemplechdir /home/foobar/baz
Chriki
2
Ca + H change juste les fenêtres d'écran pour moi. Rien à voir avec un fichier journal!
aaa90210
2
@ aaa90210 C'est ctrl-a suivi d'une pression séparée de h pour une copie papier. ctrl-a suivi d'une pression séparée de shift-h démarre un fichier journal complet.
James
1
Vous recherchez le fichier screenlog.0 créé par Ctrl-a H? unix.stackexchange.com/questions/198881/…
straville
20

La réponse sélectionnée ne fonctionne pas très bien avec plusieurs sessions et ne permet pas de spécifier un nom de fichier journal personnalisé.

Pour plusieurs sessions d'écran, voici ma formule:

  1. Créez un fichier de configuration pour chaque processus:

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

    Si vous voulez le faire "à la volée", vous pouvez changer logfileautomatiquement. \012signifie "nouvelle ligne", car utiliser \nl'imprimera sur le fichier journal: source .

  2. Démarrez votre commande avec les indicateurs "-c" et "-L":

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

    C'est tout. Vous verrez "test.log" après le premier vidage:

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

J'ai trouvé que "-L" est toujours requis même lorsque "log on" est sur le fichier de configuration.

Je n'ai pas trouvé de liste des variables de format d'heure (comme% m) utilisées par screen. Si vous avez un lien de ces formats, veuillez le poster ci-dessous.

Supplémentaire

Si vous souhaitez le faire "à la volée", vous pouvez utiliser ce 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

Pour l'utiliser, enregistrez-le (screen.sh) et définissez les autorisations + x:

./screen.sh TEST ./test.pl

... et exécutera ./test.pl et créera un fichier journal dans /var/log/TEST.log

lépe
la source
1
Merci - la on-the-flypartie est super utile.
Ram RS
1
Ensuite, un écran a fonctionné pendant la nuit avec un fichier de configuration créé et supprimé à la volée en erreur sur un screen -ravec "Unable to open "/tmp/log.conf". En outre, l'écran est passé de l' [detached]état à inexistant. Quel aurait pu être le problème?
Ram RS
1
Que fait votre commande? écran recréera le fichier journal lorsqu'il est manquant, donc je suppose que / tmp / manque d'espace ou a un autre problème lié au système d'exploitation? J'utilise cette approche dans plusieurs serveurs qui fonctionnent indéfiniment et jusqu'à présent, je n'ai pas vu une telle situation depuis au moins 1 an. Si vous le souhaitez, nous pouvons démarrer une discussion et je peux vous aider à résoudre votre problème.
lepe
1
Je pense que vous avez raison, il ne devrait pas mettre fin à l'écran si vous exécutez le processus de cette façon, ce qui est le même que l' exécution: screen bash. Si un autre processus tue votre écran, il doit être répertorié comme «mort», mais pas de disparition. Je ne sais pas ce que cela peut être.
lepe
1
@ qräbnö: Belle prise! Tout ce temps et je ne l'ai pas remarqué. J'ai mis à jour la réponse en conséquence.
lepe
20

La commande suivante fonctionne pour Screen version 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Depuis la page de manuel de Screen :

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

Vous pouvez vérifier la version existante de Screen à l' aide de screen -version . Vous pouvez télécharger et installer la dernière version de Screen à partir de https://www.gnu.org/software/screen/ .

Nikhil
la source
Vous pouvez également laisser le champ command_to_be_executed vide et entrer une série de tâches de longue durée
devssh
N'oubliez pas d'avoir les autorisations d'écriture sur le répertoire de travail de l'écran, car sinon, il échoue silencieusement (simplement ne pas se connecter sans aucun avertissement)
okrutny
15

Pour le terminal Mac:

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

Détails

  • script: Une application intégrée pour "faire un dactylographié de session de terminal"
  • -a: Ajouter au fichier de sortie
  • -t 0: Le temps entre l'écriture dans le fichier de sortie est de 0 seconde, donc out.txt est mis à jour pour chaque nouveau caractère
  • out.txt: Est juste le nom du fichier de sortie
  • screen /dev/ttyUSB0 115200: Commande à partir de la question pour la connexion à un appareil externe

Vous pouvez ensuite utiliser tail pour voir que le fichier est en cours de mise à jour.

tail -100 out.txt
Ryan
la source
1
Cela n'a pas fonctionné pour moi sur un Mac. Le fichier journal affiche le script commençant le commun et la commande se terminant, mais pas les données reçues de la commande screen.
David
10

Ctrl+AShift+Htravaille alors pour moi. Vous pouvez afficher le fichier screenlog.0pendant que le programme est toujours en cours d'exécution.

déchiqueté
la source
1
Ctrl + A puis H.
Shimon Doodkin
1
@ShimonDoodkin J'ai essayé cela, pour une raison quelconque, cela ne fonctionne pas sur Debian. Cela pourrait cependant être utile aux autres. Merci!
jaggedsoft
5

La commande 'script' sous Unix devrait faire l'affaire. Exécutez-le simplement au début de votre nouvelle console et vous devriez être bon.

Ruben
la source
génial! où l'imprime-t-il?
Edoardoo
Il devrait simplement écrire dans un fichier. La commande est un peu compliquée mais je pense que cela pourrait résoudre un peu le problème
Ruben
5

Voici un truc: enveloppez-le sh -c!

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

2>&1redirige stderr vers stdout afin de teepouvoir intercepter et enregistrer les messages d'erreur.

Rkok
la source
5

Ce qui suit peut être utile (testé sur: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

En utilisant ce qui précède, vous pouvez ensuite effectuer toutes les réorientations dont vous avez besoin. Par exemple, pour vider la sortie sur votre console tout en enregistrant dans votre fichier, vous feriez:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
la source
Celui-ci a parfaitement fonctionné pour moi. J'enregistre la sortie du moniteur série à partir d'une session de capture de données Arduino.
Ian Pitts
3

Une réponse différente si vous devez enregistrer la sortie de l'ensemble de votre tampon de défilement à partir d'un écran déjà actif:

Ctrl-a [ g SPACE G $ >.

Cela enregistrera tout votre tampon dans / tmp / screen-exchange

rkelleycook
la source
2

Le journal d'écran existant peut être enregistré par:

Ctrl+A : copie papier -h nom de fichier

Ratan Raj
la source