2013-04-27 5 views
2

У меня есть сценарий, использующий DaemonRunner для создания процесса daemon с pid-файлом. Проблема в том, что если кто-то попытается запустить его, не останавливая текущий процесс, он будет терпеть неудачу. Каков наилучший способ обнаружить существующий процесс и предупредить пользователя о его прекращении? Это так же просто, как проверка pidfile?DaemonRunner: обнаружение, если демон уже запущен

Мой код похож на этот пример:

#!/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() 

Чтобы увидеть мой фактический код, смотрите на investor.py в: https://github.com/jgillick/LendingClubAutoInvestor

ответ

0

Это решение, которое я решил использовать:

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() 

Это лучшая практика или есть лучший способ?

1

так как DaemonRunner обрабатывает свой собственный файл lockfile, более разумно обращаться к нему, чтобы быть уверенным, что вы не можете испортить. Может быть, этот блок может помочь вам в этом:

Добавить
from lockfile import LockTimeout
в начале сценария и окружать daemon_runner.doaction() как этот

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

Если вам нужно вы можете сократить 'self.pidfile_timeout' в 'def __init__' – ExploWare

+0

это работало очень хорошо для меня. Спасибо – jnichols959

Смежные вопросы