Nohup schreibt kein Protokoll in die Ausgabedatei

141

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.writeanstatt printzum Drucken auf die Standardausgabe. Mache ich etwas falsch


quelle
Welche Variante von verwenden nohupSie? Die BSD-Version schreibt in eine Datei, die nohup.outim aktuellen Verzeichnis aufgerufen wird (oder $HOME/nohup.outwenn das aktuelle Verzeichnis nicht beschreibbar ist). Ich sehe keine Möglichkeit, den Namen der Ausgabedatei zu ändern ...
Wulong
@wulong Das ist nur möglich, wenn stdout ein Terminal ist.
John Kugelman
Ich habe den Befehl auch ohne Umleitung ausprobiert und die Datei nohup.out überhaupt nicht erstellt. Ich weiß nicht, um welche Variante es sich handelt, aber ich bin auf SunOS 5.10, wenn das hilft.

Antworten:

103

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, printbis das Programm beendet wird.

Wulong
quelle
17
Python sowie andere C stdio-basierte Programme verwenden Zeilenpufferung im interaktiven Fall (stdout ist mit einem tty verbunden) und Blockpufferung, wenn sie in eine Datei umgeleitet werden. Wenn python -unicht funktioniert; nohupkönnte eine eigene Pufferung eingeführt haben.
JFS
12
@JFSebastian Ab heute wird nohupdie Ausgabe nicht gepuffert und python -ufunktioniert einwandfrei . (nur ein Update für Leute)
Pijusn
1
@Pius: Ist nohupein 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.
JFS
381

Sie können Python mit dem -uFlag ausführen , um eine Ausgabepufferung zu vermeiden:

nohup python -u ./cmd.py > cmd.log &
vz0
quelle
12
Das ist besser! Vielen Dank :)
Sadjad
@kommradHomer Ich denke, es hängt von der Menge der Ausgabe auf stdout / stderr ab, die Ihr Programm produziert.
vz0
1
Klappt wunderbar. Ich denke auch, dass es eine bessere Antwort ist als die als richtig ausgewählte. Könnten Sie dies bitte als richtig markieren, um andere nicht zu verwirren?
Ondrej Burkert
1
Achtung: Es funktioniert nicht immer . Ich weiß nicht warum. Machst du?
Basj
3
Dies sollte die akzeptierte Antwort sein ... tat was ich wollte. Vielen Dank!
Krinker
42
  • Verwenden -u mit nohuparbeitete für mich. Mit -uwird erzwungen stdout, dass die stderrStreams ungepuffert werden. Es wird stdin nicht beeinflussen. Alles wird in der Datei " nohup.out " gespeichert. So was-

    nohup python -u your_code.py &

    Sie können es auch in Ihrem Verzeichnis speichern. Diesen Weg-

    nohup python -u your_code.py > your_directory/nohup.out &
  • Auch können Sie verwenden PYTHONUNBUFFERED. Wenn Sie eine nicht leere Zeichenfolge festlegen, funktioniert sie genauso wie die -uOption. Für die Verwendung dieses Befehls führen Sie die folgenden Befehle aus, bevor Sie Python-Code ausführen.

    export PYTHONUNBUFFERED=1

    oder

    export PYTHONUNBUFFERED=TRUE

PS: Ich werde vorschlagen, Tools wie Cron-Job zu verwenden, um Dinge im Hintergrund auszuführen und die Ausführung zu planen.

Nurul Akter Towhid
quelle
Was ist der Unterschied zu der Antwort von @ vz0?
Deqing
1
@Deqing gibt es keinen Unterschied.
Overcode
2

Python 3.3 und höher hat ein Flush-Argument zum Drucken und dies ist die einzige Methode, die für mich funktioniert hat.

print("number to train = " + str(num_train), flush=True)
print("Using {} evaluation batches".format(num_evals), flush=True)
Ganesh Krishnan
quelle
0

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:

  1. stdin, stdout und stderr umleiten
  2. Sicherstellen, dass das über nohup aufgerufene Skript nichts anderes im Hintergrund ausführt

PS: Meine Skripte wurden in ksh geschrieben, das auf RHEL läuft

Pradeep Anchan
quelle