2013-06-20 20 views
5

Ich versuche, einen Prozess mit dem daemon Modul zu dämonisieren. Code sieht so ausPython: Daemonizing-Prozess mit PID-Datei

import sys 
import time 
import daemon 
import lockfile 


def do_things(): 
    while True: 
     print "hello" 
     time.sleep(3) 

def main() 
    context = daemon.DaemonContext(stdout=sys.stdout, 
            pidfile=lockfile.FileLock('test.pid')) 

    with context: 
     do_things() 

Jetzt hier sehen Sie, dass ich eine Sperre PID-Datei erstellen. Jetzt laufe ich dieses Programm und es läuft gut. Jetzt testen die PID/Daemon-Funktionalität ich eine andere Instanz des Programms beginnen

python test.py 

jetzt dieses Mal ist es nicht laufen sollte, da eine vorherige Instanz bereits ausgeführt wird. Stellt sich heraus, dass die 2. Instanz startet und in eine Schleife kommt (diese ist nicht die while Schleife in meiner Testfunktion). strace auf dieser zweiten Instanz läuft gibt die folgende Ausgabe kontinuierlich

stat("/some-path-here/[email protected]", {st_mode=S_IFREG|0666, 
st_size=0, ...}) = 0 
select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout) 

link("/some-path-here/[email protected] 4e1a9720.21520", 
"/somepath/test.pid.lock") = -1 EEXIST (File exists) 

Und diese Spur scheint ewig, bis der Prozess gewaltsam getötet wird. Die Lockfile-Funktionen haben zwar das Vorhandensein einer vorhandenen Sperrdatei erkannt, aber das Problem besteht darin, dass das Programm nicht beendet wird. Auch ich möchte, dass dieser Fehler angezeigt wird, dass die PID-Datei bereits existiert.

Wie kann das gemacht werden?

Antwort

2

HINWEIS: Diese Antwort setzt voraus, dass Sie die python-daemon-Bibliothek verwenden.

Die Daemon-Bibliothek enthält eine Hilfsklasse daemonDaemonRunner, die die Erstellung der PID-Datei übernimmt. Betrachtet man die Interna davon, verwendet es daemon.pidfile.TimeoutPIDLockFile als die Art der Sperrdatei.

So sieht es aus wie Sie dies entweder lösen kann:

  • Verwenden daemon.DaemonRunner (wir gefunden haben, diese sehr bequem zu bedienen) zu einem daemon.pidfile.TimeoutPIDLockFile
  • ändern die Art der pidfile.
+0

Ich versuchte den 2. Ansatz und das ist noch schlechtere Ergebnisse gegeben. Es gibt keine PID-Datei im Arbeitsverzeichnis und es klagt immer noch über seine Existenz! Ich bestätigte via strace – auny

+0

strace gibt "offen (" test.pid ", O_WRONLY | O_CREAT | O_EXCL, 0644) = -1 EEXIST (Datei existiert)" – auny