Wie kann ich die Ausgabe eines getrennten Bildschirms mit einem Skript speichern?

7

Ich habe ein Python-Skript test.py, das nur enthält : print('hi'). Ich möchte es in einem ausführen, screendamit die Ausgabe von screengespeichert wird script.

Ich benutze den folgenden Befehl, um test.pyin a auszuführen screen, es funktioniert gut:

screen -dm bash -c 'python test.py'

Es ist mir jedoch noch nicht gelungen, einen Weg zu finden script, um die Ausgabe des zu speichern screen. Wie kann ich es tun?


Ich habe erfolglos versucht:

  • script -c "screen -dm bash -c 'python test.py'" output.txt: Die Ausgabedatei output.txt enthält nicht hi, sondern nur:

    Script started on Fri 26 Aug 2016 01:04:59 PM EDT
    
    Script done on Fri 26 Aug 2016 01:04:59 PM EDT
    

Ich benutze Ubuntu 14.04.4 LTS x64.


Dokumentation:

https://www.gnu.org/software/screen/manual/screen.html :

-d -m: Startbildschirm im getrennten Modus. Dadurch wird eine neue Sitzung erstellt, die jedoch nicht an sie angehängt wird. Dies ist nützlich für Systemstart-Skripte.

http://linux.about.com/library/cmd/blcmdl1_sh.htm :

-c Zeichenfolge: Wenn die Option -c vorhanden ist, werden Befehle aus der Zeichenfolge gelesen. Wenn nach der Zeichenfolge Argumente vorhanden sind, werden diese den Positionsparametern zugewiesen, beginnend mit $ 0.

Manpage des Skripts:

-c, --command run Befehl statt interaktive Shell

Franck Dernoncourt
quelle

Antworten:

6

Du solltest es umgekehrt machen, scriptdrinnen laufen screen:

screen -dm bash -c 'script -c "python test.py" output.txt'
Stephen Kitt
quelle
12

Mit dem -LFlag können Sie eine automatische screenlog.0Datei erstellen

z.B

$ screen -dm -L sh -c 'echo hello'
$ cat screenlog.0 
hello

Wenn Sie eine lange laufende Bildschirmsitzung haben, die nicht protokolliert wird, können Sie die Protokollierung später aktivieren

z.B

$ screen -dm -S test sh -c 'while [ 1 ]; do date; sleep 1; done'

Jetzt können wir die Protokollierung aktivieren

$ screen -S test -p 0 -X log

Warten Sie einige Zeit, da die Protokollierung in Blöcken geschrieben ist und ...

$ cat screenlog.0
Fri Aug 26 13:25:49 EDT 2016
Fri Aug 26 13:25:50 EDT 2016
Fri Aug 26 13:25:51 EDT 2016
Fri Aug 26 13:25:52 EDT 2016
Fri Aug 26 13:25:53 EDT 2016
Fri Aug 26 13:25:54 EDT 2016
Fri Aug 26 13:25:55 EDT 2016
Fri Aug 26 13:25:56 EDT 2016
Fri Aug 26 13:25:57 EDT 2016
Fri Aug 26 13:25:58 EDT 2016
Stephen Harris
quelle
2
Ist dies eine Möglichkeit, den Ausgabeverlauf von Anfang an zu speichern, wenn der Bildschirm bereits ohne -L gestartet wurde?
Nicolas
Danke für die Antwort. Ich habe das versucht screen -dm -L bash -c 'python running_4ever.py' und sehe das Protokoll sowie den neu erstellten Bildschirm als getrennt. Ich frage mich, wie wir es anhängen oder töten können. Ich habe es versucht screen -r <screen_id>, aber nicht funktioniert.
Leo
@Leo das klingt wie Sie eine neue Frage erstellen müssen
Stephen Harris
@ StephenHarris Hallo Stephen, ich habe es herausgefunden. Ich habe es versucht screen -dm -S <screen_name> -L bash -c "python running_4ever.py" und es hat funktioniert, dann habe ich es einfach screen -XS <screen_name> quitgetötet. Vielen Dank für die Antwort
Leo
1

Eine andere Möglichkeit besteht darin, zuerst den Bildschirm anzubringen:

screen -r <pid or name>

und dann:

Ctrl+ A,H

Die Anmeldung wird gestartet screenlog.0

Lepe
quelle
0

Könnte klappen!

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