Python pythondaemon锁文件超时打开锁眼()

2024-06-01 19:46:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python-daemon模块来管理我的Python脚本的守护进程。 但是,我在运行脚本时遇到了一个头痛的问题,我根本就搞不懂。我也不知道如何开始调试它。在

我有密码:

def run_application():
    #Do something here...

class App():
    def __init__(self):
        self.stdin_path = '/dev/null'
        self.stdout_path = 'stdout.txt'
        self.stderr_path = 'stdlog.log'
        self.pidfile_path = 'filelock.pid'
        self.pidfile_timeout = 5
    def run(self):
        run_application()


app = App()
daemon_runner = runner.DaemonRunner(app)
daemon_runner.do_action()

运行时,它总是将以下内容写入stdlog.log

^{pr2}$

所以当试图锁定filelock.pid时,它似乎超时了。我不知道为什么会这样。我删除了filelock.pid,我更改了权限;每次都是相同的错误。在

我如何开始调试这个???我不知所措。在

我正在使用python-daemon version 1.6(如果重要的话)。在

更新:

按照建议here,我现在看到已经有一个进程在运行。现在我如何确定正在运行的守护进程的PID。在


Tags: pathrunself脚本apphereapplication进程
2条回答

我同意@ExploWare的观点,因为他演示了如何捕获那些LockTimeout异常。在

因此,作为一种调试和查看是什么进程持有这个锁的方法,这里有一段外部代码可以运行。。。在

import daemon.pidfile
import os
import lockfile

# We know the lockfile name.
pidfile = daemon.pidfile.PIDLockFile(
                            os.path.join("/MyApp/","filelock.pid"))

# This current process id...
os.getpid()
# 46337

那么哪个进程获得了这个锁(如果有的话)?在

^{pr2}$

当我们的PIDLockFile实例尝试“acquire”时

pidfile.__dict__
# {'unique_name': '/MyApp/filelock.pid', 'lock_file': '/MyApp/filelock.pid.lock', 'hostname': 
# 'MyMachine.local', 'pid': 46337, 'timeout': None, 'tname': '', 'path': '/MyApp/filelock.pid'}

pidfile.acquire()
#
# (Had to Control-C quit because I didnt set a timeout on PIDLockFile )
#
# ^CTraceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "/Users/michal/venf/lib/python2.7/site-packages/lockfile/pidlockfile.py", line 92, in acquire
#     time.sleep(timeout is not None and timeout/10 or 0.1)
# KeyboardInterrupt

因此,使用@ExploWare的异常捕捉。在

# Wait only 5 seconds.
pidfile.timeout = 5

try:
    pidfile.acquire()
except lockfile.LockTimeout:
    print 'locked . need to wait or move on.'
# 
# locked . need to wait or move on.

我找到了一个很好的方法来处理这个异常,所以也许它对您也有帮助:
添加
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

相关问题 更多 >