Bildschirmausgabe (Programm) in einer Datei speichern

130

Ich muss die gesamte Ausgabe von Screen in einer Datei speichern, um später den gesamten Inhalt zu überprüfen.

Der Grund dafür ist, dass ich einen Flash-Speicher über eine serielle Schnittstelle speichere und Screen als Schnittstelle verwende. Ich möchte es in einer Datei speichern, um die Speicherstruktur zu überprüfen.

Ich habe es versucht:

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

Ich habe auch versucht, Bufferfile vom Bildschirm aus zu verwenden, aber ich verstehe nicht, wie ich es verwenden soll.

Gibt es einen einfachen Weg?

Edoardoo
quelle
Die von mir verwendete Produktionseinstellung enthält mehrere Bildschirminstanzen. Derjenige, dessen Ausgabe ich brauche, hat die Zeile 'pts / 10'. Was soll ich also tun, um die Ausgabe in eine Datei zu erhalten?
Sid

Antworten:

129

Es gibt eine Befehlszeilenoption für die Protokollierung. Die Ausgabe wird in der Datei screenlog.n gespeichert, wobei n eine Nummer des Bildschirms ist. Aus den Manpages des Bildschirms:

'-L' Weist den Bildschirm an, die automatische Ausgabeprotokollierung für die Fenster zu aktivieren.

Fergie
quelle
6
Vielen Dank. Gibt es eine Möglichkeit, das auszugeben, was der Bildschirm bereits im Ausgabepuffer hat? ZB habe ich vergessen, die Protokollierung zu aktivieren, aber die Ausgabe ist im Puffer des Bildlaufbildschirms verfügbar. Wie schreibe ich das in eine Datei?
Tagar
48
Ich habe nur ein bisschen mehr gegoogelt. Hier ist die Antwort auf meinen vorherigen Kommentar - stackoverflow.com/questions/4807474/… Strg + A und: Um in den Befehlsmodus zu gelangen, dann Hardcopy -h <Dateiname>, falls jemand anderes dies benötigt.
Tagar
3
Die Protokolldatei wird in demselben Verzeichnis erstellt, in dem Sie den Bildschirm ausgeführt haben.
Lepe
1
Gestern habe ich ein "screen -L" gemacht, meine SSH-Sitzung getrennt, mich heute erneut angemeldet und mit "screen -r" (ich hatte nur eines) erneut verbunden, beendet und ein Programm ausgeführt, bei find / -name "screen*log"dem nichts gefunden wurde.
Pacoverflow
104

Sie können auch Control-a + H verwenden, um Protokollierungen in der Datei screenlog.n zu speichern. Noch ein Control-a + H zum Ausschalten.

Ca H: Beginnt / beendet die Protokollierung des aktuellen Fensters in der Datei "screenlog.n".

NeliJ
quelle
5
+1. Wenn das Protokoll nicht erstellt werden kann, versuchen Sie, das Arbeitsverzeichnis des Bildschirmfensters zu ändern: Strg- a+ :und geben Sie beispielsweisechdir /home/foobar/baz
Chriki
2
Ca + H wechselt nur die Bildschirmfenster für mich. Nichts mit einer Protokolldatei zu tun!
aaa90210
2
@ aaa90210 Es ist Strg-A, gefolgt von einem separaten Drücken von h für eine Hardcopy. Strg-A gefolgt von einem separaten Drücken von Shift-H startet eine vollständige Protokolldatei.
James
1
Suchen Sie nach der von Strg-a H erstellten Datei screenlog.0? unix.stackexchange.com/questions/198881/…
Straville
20

Die ausgewählte Antwort funktioniert bei mehreren Sitzungen nicht ganz gut und ermöglicht nicht die Angabe eines benutzerdefinierten Protokolldateinamens.

Für Sitzungen mit mehreren Bildschirmen ist dies meine Formel:

  1. Erstellen Sie für jeden Prozess eine Konfigurationsdatei:

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

    Wenn Sie dies "on the fly" tun möchten, können Sie es logfileautomatisch ändern . \012bedeutet "neue Zeile", da mit using \nin der Protokolldatei: source gedruckt wird .

  2. Starten Sie Ihren Befehl mit den Flags "-c" und "-L":

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

    Das ist es. Nach dem ersten Flush wird "test.log" angezeigt:

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

Ich habe festgestellt, dass "-L" auch dann noch erforderlich ist, wenn sich "Anmelden" in der Konfigurationsdatei befindet.

Ich konnte keine Liste der vom Bildschirm verwendeten Zeitformatvariablen (wie% m) finden. Wenn Sie einen Link zu diesen Formaten haben, posten Sie ihn bitte unten.

Extra

Wenn Sie dies "on the fly" tun möchten, können Sie dieses Skript verwenden:

#!/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

Um es zu verwenden, speichern Sie es (screen.sh) und legen Sie + x Berechtigungen fest:

./screen.sh TEST ./test.pl

... und führt ./test.pl aus und erstellt eine Protokolldatei in /var/log/TEST.log

Lepe
quelle
1
Danke - das on-the-flyTeil ist super nützlich.
Ram RS
1
Im Anschluss an einem Bildschirm läuft über Nacht mit einer Konfigurationsdatei im laufenden Betrieb erstellt und gelöscht errored heraus ein screen -rmit "Unable to open "/tmp/log.conf". Außerdem wurde der Bildschirm von " [detached]Status" in "Nicht vorhanden" geändert. Was könnte das Problem gewesen sein?
Ram RS
1
Was macht Ihr Befehl? Der Bildschirm erstellt die Protokolldatei neu, wenn sie fehlt. Ich vermute also, dass / tmp / nicht mehr genügend Speicherplatz vorhanden ist oder ein anderes Betriebssystemproblem aufgetreten ist. Ich verwende diesen Ansatz auf mehreren Servern, die unbegrenzt laufen, und bisher habe ich eine solche Situation seit mindestens 1 Jahr nicht mehr gesehen. Wenn Sie möchten, können wir einen Chat starten und ich kann Ihnen helfen, Ihr Problem zu beheben.
Lepe
1
Ich denke, Sie haben Recht, es sollte den Bildschirm nicht beenden, wenn Sie den Prozess auf diese Weise ausführen, was der Ausführung entspricht : screen bash. Wenn ein anderer Prozess Ihren Bildschirm zerstört, sollte er als "tot" aufgeführt werden, aber nicht verschwinden. Ich bin mir nicht sicher, was es sein kann.
Lepe
1
@ qräbnö: Schöner Fang! Die ganze Zeit und ich habe es nicht bemerkt. Ich habe die Antwort entsprechend aktualisiert.
Lepe
20

Der folgende Befehl funktioniert für Bildschirmversion 4.06.02:

screen -L -Logfile Log_file_name_of_your_choice command_to_be_executed

Von der Manpage von Screen :

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

Sie können die vorhandene Version von Screen mit screen -version überprüfen . Sie können die neueste Bildschirmversion von https://www.gnu.org/software/screen/ herunterladen und installieren .

Nikhil
quelle
Sie können den Befehl_to_be_executed auch leer lassen und eine Reihe von Jobs mit langer Laufzeit
eingeben
Denken Sie daran, Schreibberechtigungen für das Arbeitsverzeichnis des Bildschirms zu haben, da dies sonst
unbeaufsichtigt
15

Für das Mac-Terminal:

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

Einzelheiten

  • script: Eine integrierte Anwendung zum "Erstellen eines Typoskripts für eine Terminalsitzung"
  • -a: An Ausgabedatei anhängen
  • -t 0: Die Zeit zwischen dem Schreiben in die Ausgabedatei beträgt 0 Sekunden, daher wird out.txt für jedes neue Zeichen aktualisiert
  • out.txt: Ist nur der Name der Ausgabedatei
  • screen /dev/ttyUSB0 115200: Befehl von Frage zum Herstellen einer Verbindung mit einem externen Gerät

Sie können dann tail verwenden, um zu sehen, dass die Datei aktualisiert wird.

tail -100 out.txt
Ryan
quelle
1
Dies funktionierte bei mir auf einem Mac nicht. Die Protokolldatei zeigt das Skript, das den allgemeinen Befehl startet und den Befehl beendet, jedoch nicht die vom Bildschirmbefehl empfangenen Daten.
David
10

Ctrl+Adann Shift+Harbeitet für mich. Sie können die Datei anzeigen, screenlog.0während das Programm noch ausgeführt wird.

jaggedsoft
quelle
1
Strg + A dann H.
Shimon Doodkin
1
@ ShimonDoodkin Ich habe das versucht, aus irgendeinem Grund funktioniert es nicht unter Debian. Könnte aber für andere hilfreich sein. Vielen Dank!
Jaggedsoft
5

Der Befehl 'script' unter Unix sollte den Trick machen. Führen Sie es einfach am Anfang Ihrer neuen Konsole aus und Sie sollten gut sein.

Ruben
quelle
großartig! wo druckt es es aus?
Edoardoo
Es sollte nur in eine Datei schreiben. Befehl ist ein bisschen chaotisch, aber ich denke, das könnte das ein bisschen lösen: linux.byexamples.com/archives/279/…
Ruben
5

Hier ist ein Trick: Wickeln Sie es ein sh -c!

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

Wenn 2>&1stderr nach stdout umgeleitet wird, teekönnen Fehlermeldungen abgefangen und protokolliert werden.

rkok
quelle
5

Folgendes könnte nützlich sein (getestet unter: Linux / Ubuntu 12.04 (Precise Pangolin)):

cat /dev/ttyUSB0

Mit den oben genannten Anweisungen können Sie dann alle erforderlichen Umleitungen vornehmen. Um beispielsweise die Ausgabe auf Ihrer Konsole zu speichern, während Sie sie in Ihrer Datei speichern, gehen Sie wie folgt vor:

cat /dev/ttyUSB0 | tee console.log
Keo Malope
quelle
Dieser hat perfekt für mich funktioniert. Ich protokolliere die Ausgabe eines seriellen Monitors von einer Arduino-Datenerfassungssitzung.
Ian Pitts
3

Eine andere Antwort, wenn Sie die Ausgabe Ihres gesamten Scrollback-Puffers von einem bereits aktiv laufenden Bildschirm speichern müssen:

Ctrl-a [ g SPACE G $ >.

Dadurch wird Ihr gesamter Puffer in / tmp / screen-exchange gespeichert

rkelleycook
quelle
2

Das vorhandene Bildschirmprotokoll kann gespeichert werden durch:

Ctrl+A : Hardcopy -h Dateiname

Ratan Raj
quelle