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?
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
strace gibt "offen (" test.pid ", O_WRONLY | O_CREAT | O_EXCL, 0644) = -1 EEXIST (Datei existiert)" – auny