Daemon starten - Problem mit offenen Filehandles

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
pythonthomas
User
Beiträge: 3
Registriert: Dienstag 24. November 2009, 09:36

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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!
pythonthomas
User
Beiträge: 3
Registriert: Dienstag 24. November 2009, 09:36

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
pythonthomas
User
Beiträge: 3
Registriert: Dienstag 24. November 2009, 09:36

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Benutze am besten das [mod]subprocess[/mod]-Modul (siehe Parameter close_fds), das nimmt dir die plattformspezifische Arbeit ab.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten