Seite 1 von 1

Daemon starten - Problem mit offenen Filehandles

Verfasst: Dienstag 24. November 2009, 11:56
von pythonthomas
Hallo,

ich habe folgende Methode in einem separetem Pythonskript, welches einen Daemon starten soll, der auch nach Beendigung des PythonSkriptes laufen soll.

Code: Alles auswählen

def startMyDaemon():
    MY_DAEMON_EXE =  "C:\\path_to_my_daemon\\my_daemon.exe"
    
    cmdDaemon = os.path.basename(MY_DAEMON_EXE) + " -my_daemon_arg" 
    os.spawnl(os.P_NOWAIT, MY_DAEMON_EXE, cmdDaemon)
    
    return

Der Daemon wird auch richtig gestartet.
Nun wird aber meine Methode wiederum in anderen Python-Skripten genutzt, welche nicht in meiner Verantwortung liegen und ich auch keinen Einfluss auf diese habe.

Code: Alles auswählen

def notMyMethod():
    f = open("notMyFile", "w")    
    f.write("text_text_text")
    
    startMyDaemon.startMyDaemon()
    
    f.write("text_text_text")
    f.close()
    
    os.rename("notMyFile", "anaotherNotMyFile")
    
    return

Die Methode notMyMethod() liefert nun folgenden Traceback
  • >>os.rename(notMyFile, anaotherNotMyFile)
    >>OSError: [Errno 13] Permission denied
Wenn ich mir in einem ProzessMonitor (z.B. procexp) den von mir gestarteten Daemon ansehe, so sehe ich, dass dieser ein Handle auf das File notMyFile hält.
Also kann ein os.rename() oder auch os.remove() nicht klappen.

Nun meine Frage:
Wie kann ich meinen Daemon starten, ohne dass er die offenen Filehandles übergeben bekommt?
Die Umgebung (Umgebungsvariablen) für den Daemon sollte nach Möglichkeit erhalten bleiben.
Auf die aufrufende Methode notMyMethod() habe ich keinen Einfluss und kann diese nicht ändern.
Das Skript soll sowohl unter Windows als auch unter Unix laufen.
Die verwendete Pythonversion ist 2.4, diese darf auch nicht verändert werden.

Vielen Dank für Eure Tipps vorab.
Gruss Thomas

Verfasst: Dienstag 24. November 2009, 12:05
von ms4py
Warum schließt du nicht einfach die Datei vor dem Starten des Daemons ;)

Edit: Wenn du sie nochmal benötigst, einfach wieder öffnen.

Außerdem sollte das schließen einer Datei immer über try..finally bzw. ContextManager geschehen!

Verfasst: Dienstag 24. November 2009, 12:35
von pythonthomas
Hallo,

ich habe keinen Einfluss darauf, welche Dateien geöffnet sind, auch keine Information, welche Dateien geöffnet sein können. Der Beispielcode soll von notMyMethod() soll nur veranschaulichen, dass Datei(en) geöffnet sind.

Gruss Thomas

Verfasst: Dienstag 24. November 2009, 17:51
von pythonthomas
Hallo,

für Windows kann ich CreateProcess() der win32process-API nutzen:

Code: Alles auswählen

info = win32process.CreateProcess(None, # AppName\
                                      cmd, # Command line\
                                      None, # Process Security\
                                      None, # ThreadSecurity\
                                      0, # Inherit Handles?\
                                      win32process.NORMAL_PRIORITY_CLASS,\
                                      None, # New environment\
                                      None, # Current directory\
                                      si) # startup info.
Der 5. Parameter von CreateProcess() steuert, ob Filehandles übergeben werden sollen oder nicht.

Gruss Thomas

Verfasst: Dienstag 24. November 2009, 22:44
von birkenfeld
Benutze am besten das [mod]subprocess[/mod]-Modul (siehe Parameter close_fds), das nimmt dir die plattformspezifische Arbeit ab.