DaemonRunner:检测守护程序是否已在运行

时间:2013-04-27 00:20:21

标签: python python-2.7 python-daemon

我有一个使用DaemonRunner创建带有pid文件的守护进程的脚本。问题是,如果有人试图在不停止当前正在运行的进程的情况下启动它,它将无声地失败。检测现有流程并提醒用户先停止流程的最佳方法是什么?它是否像检查pid文件一样简单?

我的代码与此示例类似:

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

2 个答案:

答案 0 :(得分:1)

因为DaemonRunner处理它自己的锁定文件,所以更明智地引用它,以确保你不会陷入困境。也许这个块可以帮助你:

添加
    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

答案 1 :(得分: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()

这是最佳做法还是有更好的方法?