我正在尝试使用daemon
模块将进程变为守护进程。代码大致如下:
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)
直到强制杀死进程,这个跟踪信息会一直出现。锁定文件函数确实检测到已存在的锁定文件,但问题是程序不退出。我希望显示这个错误,即pid文件已经存在。
怎么做呢?