Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用PID文件的守护进程_Python_Daemon_Pid_Lockfile - Fatal编程技术网

Python:使用PID文件的守护进程

Python:使用PID文件的守护进程,python,daemon,pid,lockfile,Python,Daemon,Pid,Lockfile,我正在尝试使用守护进程模块对进程进行守护。代码看起来像这样 import sys import time import daemon import lockfile def do_things(): while True: print "hello" time.sleep(3) def main() context = daemon.DaemonContext(stdout=sys.stdout,

我正在尝试使用
守护进程
模块对进程进行守护。代码看起来像这样

import sys
import time
import daemon
import lockfile 


def do_things():
    while True:
        print "hello"
        time.sleep(3)

def main()
    context = daemon.DaemonContext(stdout=sys.stdout, 
                                   pidfile=lockfile.FileLock('test.pid'))

    with context:
        do_things()
现在您可以看到我正在创建一个锁PID文件。现在我运行这个程序,它运行得很好。现在,为了测试PID/守护程序功能,我使用

python test.py
现在,这一次它不应该运行,因为先前的实例已经在运行。结果表明,第二个实例启动并进入一个循环(这个实例不是我的测试函数中的
while
循环)。在这个第二个实例上运行
strace
,将连续给出以下输出

 stat("/some-path-here/Talha@Fedora14-4e1a9720.21520", {st_mode=S_IFREG|0666,
 st_size=0, ...}) = 0
 select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)

 link("/some-path-here/Talha@Fedora14-  4e1a9720.21520", 
 "/somepath/test.pid.lock") = -1 EEXIST (File exists)
这个痕迹会一直出现,直到这个过程被强制终止。lockfile函数确实检测到存在现有的锁文件,但问题是程序没有退出。我还希望显示此错误,说明pid文件已经存在


如何做到这一点?

注意:这个答案假设您使用的是
python守护程序库

守护程序库附带一个帮助程序类
daemonDaemonRunner
,用于处理创建pid文件的操作。从内部来看,它使用
daemon.pidfile.TimeoutPIDLockFile
作为锁文件的类型

因此,看起来您可以通过以下任一方法解决此问题:

  • 使用
    daemon.DaemonRunner
    (我们发现它使用起来非常方便)
  • 将pidfile的类型更改为
    daemon.pidfile.TimeoutPIDLockFile

我尝试了第二种方法,结果更糟。工作目录中没有pid文件,它仍在抱怨它的存在!我通过StratesTrace确认了“open”(“test.pid”,O|WRONLY | O|u CREAT | O|u EXCL,0644)=-1eexist(文件存在)