Ausführen eines Python-Skripts mithilfe eines Shell-Skripts, das die Python-Ausgabe umleitet

Ausführen eines Python-Skripts mithilfe eines Shell-Skripts, das die Python-Ausgabe umleitet

Ich führe mein Python-Skript mithilfe eines Shell-Skripts aus, run.shum 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.pySkript, 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 $COMMANDwird 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 bashdie Schritte zur Verarbeitung von Befehlen nachschlagen.

Antwort2

Ich habe das Modul schließlich verwendet, redirect_stdoutum 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.

verwandte Informationen