Question

J'utilise python-daemon, et j'ai le problème que lorsque je kill -9 Un processus, il laisse un pidfile derrière (OK) et la prochaine fois que je exécuterai mon programme, cela ne fonctionne pas à moins d'avoir déjà supprimé le pidfile à la main (pas OK).

J'attrape toutes les exceptions afin que context.close() est appelé avant de se terminer - lorsque cela se produit (par exemple sur un kill) Les fichiers /var/run/mydaemon.pid* sont supprimés et une exécution de démon suivant réussit. Cependant, lorsque vous utilisez Sigkill (kill -9), Je n'ai pas la chance d'appeler context.close(), et les fichiers / var / run restent. Dans ce cas, la prochaine fois que j'exécuterai mon programme, il ne commence pas avec succès - le processus d'origine renvoie, mais le processus en démonidité bloque à context.open().

Il semble que Python-Daemon devrait remarquer qu'il y a un pidfile pour un processus qui n'existe plus et le nettoyer, mais cela ne se produit pas. Suis-je censé faire ça à la main?

Remarque: je n'utilise pas with Parce que ce code s'exécute sur Python 2.4

from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile

context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid"))
context.open()

try:
    retry_main_loop()
except Exception, e:
    pass
context.close()
Était-ce utile?

La solution

Si vous exécutez Linux et que les verrous au niveau du processus sont acceptables, lisez la suite.

Nous essayons d'acquérir la serrure. S'il échoue, vérifiez si le verrou est acquis par un processus en cours. Si non, cassez le verrou et continuez.

from lockfile.pidlockfile import PIDLockFile
from lockfile import AlreadyLocked

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1)
try:
    pidfile.acquire()
except AlreadyLocked:
    try:
        os.kill(pidfile.read_pid(), 0)
        print 'Process already running!'
        exit(1)
    except OSError:  #No process with locked PID
        pidfile.break_lock()

#pidfile can now be used to create DaemonContext

EDIT: On dirait que PidlockFile est disponible uniquement sur LockFile> = 0.9

Autres conseils

Avec le script fourni iciLe fichier PID reste sur Kill -9 comme vous le dites, mais le script nettoie également correctement sur un redémarrage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top