Ich führe mein Python-Skript mithilfe eines Shell-Skripts aus, run.sh
um es bei Abstürzen neu zu starten:
#!/bin/sh
COMMAND='nohup python3 -u test.py run >> py.log &'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND
writelog "Exited with status $?"
writelog "Restarting"
done
Ich renne
nohup sh -u run.sh > output&
Das Problem ist, dass Python nur die erste Ausgabe (print()) an py.log streamen würde. Wie kann ich die Ausgabe sofort streamen? Ich habe es auch versucht COMMAND=./test.py run >> py.log &
. Ich wäre für die Hilfe dankbar. Danke.
Antwort1
Ihr Shell-Skript übergibt die Zeichenfolge 'run >> py.log &'
an Ihr test.py
Skript, was wahrscheinlich dazu führt, dass es nicht ordnungsgemäß ausgeführt wird.
Sie müssen Ihr Skript leicht ändern:
#!/bin/sh
COMMAND='nohup python3 -u test.py run'
LOGFILE=restart.txt
writelog() {
now=`date`
echo "$now $*" >> $LOGFILE
}
writelog "Starting"
while true ; do
$COMMAND >> py.log &
writelog "Exited with status $?"
writelog "Restarting"
done
Jetzt $COMMAND
wird Ihr im Hintergrund ausgeführt und hängt seine Ausgabe an an py.log
.
Der Grund, warum Ihr ursprüngliches Skript nicht funktioniert, liegt darin, dass die Shell-Variablen nach dem Festlegen der Ausgabeumleitungen erweitert werden, sodass >>
und &
nicht mehr als Teil des Shell-Befehls erkannt und als Argumentzeichenfolge an Ihr Python-Skript übergeben werden. Sie können LESS='+/SIMPLE COMMAND EXPANSION' man bash
die Schritte zur Verarbeitung von Befehlen nachschlagen.
Antwort2
Ich habe das Modul schließlich verwendet, redirect_stdout
um die Ausgabe in eine Datei umzuleiten und dann „ sys.stdout.flush()
after each“ print()
und „for the shell script“ zu verwenden COMMAND='./test.py run'
. Jetzt wird die Ausgabe in Echtzeit gestreamt.