nohup über subprocess

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nonstopaggropop
User
Beiträge: 1
Registriert: Donnerstag 1. August 2013, 10:50

Hallo zusammen,

bin neu in der Python Programmierung und habe eine Frage zu einem Python-Script.

Ich möchte ein Script programmieren, dass eine große Simulation in mehrere kleine Stücke zerteilt und an den Rechner schickt.
Dafür muss ich am Ende mehrere Commandozeilen ausführen.

Ich mache das momentan mit

Code: Alles auswählen

command = "nohup ./KOH 1000 16 25 16 1 10000 5 &>ScriptTest.dat &"
process = subprocess.Popen( command, shell=True, stdout=subprocess.PIPE)
Die erste Zeile ist der Aufruf, das c-Programm KOH zu starten und übergebe ihm noch Parameter. Das funktioniert auch, und er startet das Programm, allerdings funktioniert die Ausgabe in die ScriptTest.dat nicht. Er legt es an, aber das File ist leer. Kann mir jemand da weiterhelfen?

Hat sich erledigt! Ich gebe einfach

Code: Alles auswählen

process = subprocess.Popen( command, shell=True, stdout=open("script_test.dat","w"))
dahinter zu. Schon klappt es!


Danke!
NonStopAggroPop
BlackJack

@nonstopaggropop: Kann es sein das ``&>`` schlicht nicht funktioniert weil die Shell das nicht versteht? Das kennt zum Beispiel die Bash, aber es ist kein Posix, also geht das unter Debian-Derivaten so nicht mit `system()` weil da nicht die Bash sondern ``sh`` gestartet wird, was ein Link auf die ``dash`` ist.

Edit: Dann kann man sich jetzt auch Fragen warum man die unnötige Shell dazwischen schieben muss.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Deine "Loesung" ist nicht aequivalent zu dem was du davor gezeigt hast ... und schon gar nicht solltest du Dateien einfach so oeffnen ohne sie irgendwann zu schliessen. Und so wie du sie oeffnest kannst du sie nie schliessen.
Dann solltest du wenn moeglich auf die Shell verzichten.
Wenn man das beachtet kommt das hier raus:

Code: Alles auswählen

with open('ScriptTest.dat', 'w') as f:
    process = subprocess.Popen('nohup ./KOH 1000 16 25 16 1 10000 5'.split(), stdout=f, stderr=f)
BlackJack

Wobei das ``nohup`` hier keinen Sinn (mehr) macht. Denn wenn das Python-Programm nicht selber mit ``nohup`` (oder ähnlichem) gestartet wurde, werden die im Programm geöffneten Dateien geschlossen wenn ein HUP-Signal kommt. Und damit wird mit ziemlicher Sicherheit auch das ``KOH``-Programm beendet, weil dem die Standardausgaben abhanden kommen. Falls aber das Python-Programm selber schon mit ``nohup`` gestartet wurde, dann braucht man das nicht mehr für Kindprozesse machen.

In der Regel würde ich so etwas wie ``nohup`` nicht in Programme einbauen, denn der Benutzer könnte das genau so gut beim Elternprogramm selbst erledigen. Oder er benutzt etwas anderes, wie ``screen``, ``tmux``, oder das auf einem der beiden aufbauenden ``byobu``.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@BlackJack: warum sollte KOH die Standardausgabe abhanden kommen? Die ist ja auf das Filehandle f umgebogen, und dieses Filehandle wird ja im Kindprozess kopiert. Das HUP-Signal killt dann aber nur die Eltern und nicht den Kindprozess bei nohup.
Antworten