DaemonRunner: Detecta si un demonio ya se está ejecutando

Tengo un script que utiliza DaemonRunner para crear un proceso de daemon con un archivo pid. El problema es que si alguien intentó iniciarlo sin detener el proceso que se está ejecutando actualmente, fallará silenciosamente. ¿Cuál es la mejor manera de detectar un proceso existente y alertar al usuario para que lo detenga primero? ¿Es tan fácil como revisar el archivo pid?

Mi código es similar a este ejemplo:

#!/usr/bin/python import time from daemon import runner class App(): def __init__(self): self.stdin_path = '/dev/null' self.stdout_path = '/dev/tty' self.stderr_path = '/dev/tty' self.pidfile_path = '/tmp/foo.pid' self.pidfile_timeout = 5 def run(self): while True: print("Howdy! Gig'em! Whoop!") time.sleep(10) app = App() daemon_runner = runner.DaemonRunner(app) daemon_runner.do_action() 

Para ver mi código real, mire investor.py en: https://github.com/jgillick/LendingClubAutoInvestor

Ya que DaemonRunner maneja su propio archivo de locking, es más sabio referirse a ese, para asegurarse de que no se pueda desordenar. Tal vez este bloque pueda ayudarte con eso:

Añadir
from lockfile import LockTimeout
al principio de la secuencia de comandos y rodear a daemon_runner.doaction() como este

 try: daemon_runner.do_action() except LockTimeout: print "Error: couldn't aquire lock" #you can exit here or try something else 

Esta es la solución que decidí usar:

 lockfile = runner.make_pidlockfile('/tmp/myapp.pid', 1) if lockfile.is_locked(): print 'It looks like a daemon is already running!' exit() app = App() daemon_runner = runner.DaemonRunner(app) daemon_runner.do_action() 

¿Es esta una buena práctica o hay una mejor manera?