Ich verwende den folgenden Befehl, um ein Python-Skript im Hintergrund auszuführen:
nohup ./cmd.py > cmd.log &
Es scheint jedoch, dass nohup nichts in die Protokolldatei schreibt. cmd.log wird erstellt, ist aber immer leer. Im Python-Skript verwende ich sys.stdout.write
anstatt print
zum Drucken auf die Standardausgabe. Mache ich etwas falsch
nohup
Sie? Die BSD-Version schreibt in eine Datei, dienohup.out
im aktuellen Verzeichnis aufgerufen wird (oder$HOME/nohup.out
wenn das aktuelle Verzeichnis nicht beschreibbar ist). Ich sehe keine Möglichkeit, den Namen der Ausgabedatei zu ändern ...Antworten:
Es sieht so aus, als müssten Sie stdout regelmäßig spülen (z
sys.stdout.flush()
. B. ). In meinen Tests macht Python dies nicht automatisch,print
bis das Programm beendet wird.quelle
python -u
nicht funktioniert;nohup
könnte eine eigene Pufferung eingeführt haben.nohup
die Ausgabe nicht gepuffert undpython -u
funktioniert einwandfrei . (nur ein Update für Leute)nohup
ein POSIX-Dienstprogramm, kann es auf verschiedenen Plattformen unterschiedliche Implementierungen geben. Übrigens ist python3 I / O nicht mehr C-stdio-basiert, hat aber ein ähnliches Pufferverhalten.Sie können Python mit dem
-u
Flag ausführen , um eine Ausgabepufferung zu vermeiden:quelle
Verwenden
-u
mitnohup
arbeitete für mich. Mit-u
wird erzwungenstdout
, dass diestderr
Streams ungepuffert werden. Es wird stdin nicht beeinflussen. Alles wird in der Datei " nohup.out " gespeichert. So was-Sie können es auch in Ihrem Verzeichnis speichern. Diesen Weg-
Auch können Sie verwenden
PYTHONUNBUFFERED
. Wenn Sie eine nicht leere Zeichenfolge festlegen, funktioniert sie genauso wie die-u
Option. Für die Verwendung dieses Befehls führen Sie die folgenden Befehle aus, bevor Sie Python-Code ausführen.oder
PS: Ich werde vorschlagen, Tools wie Cron-Job zu verwenden, um Dinge im Hintergrund auszuführen und die Ausführung zu planen.
quelle
oder
https://docs.python.org/2/using/cmdline.html#cmdoption-u
quelle
Python 3.3 und höher hat ein Flush-Argument zum Drucken und dies ist die einzige Methode, die für mich funktioniert hat.
quelle
Ich hatte ein ähnliches Problem, war aber nicht mit einem Python-Prozess verbunden. Ich habe ein Skript ausgeführt, das ein Nohup ausgeführt hat, und das Skript wurde regelmäßig über Cron ausgeführt.
Ich konnte das Problem lösen durch:
PS: Meine Skripte wurden in ksh geschrieben, das auf RHEL läuft
quelle