如何在Linux上管理基于Python的守护程序?

时间:2010-06-01 16:45:31

标签: python linux bash daemon init.d

我有一个基于Python的程序,我想作为守护进程运行。目前,我正以非常强硬的方式在screen -d -m name会话中启动它并使用pkill -9 -f name将其删除。

最终我不得不把它移到我们在这里使用的更好的系统(因此我不愿意修改程序)但是在此期间,我正在寻找一个更清洁的方法。

我目前的想法是从inti.d脚本开始作为后台任务,但是如何编写该部件以将其恢复原状?

6 个答案:

答案 0 :(得分:6)

在linux上,有一个start-stop-daemon实用程序作为init.d工具的一部分。

它非常灵活,允许以不同的方式捕获服务器的pid。

还有一个文件/etc/init.d/skeleton,它可以作为您自己的init.d脚本的基础。

如果您的目标平台是基于debian的,那么创建一个debina包来部署它是有意义的,因为它还有助于将守护进程正确地集成到系统的其余部分中。而且它并不太复杂(如果你之前已经完成了十次; - )

答案 1 :(得分:5)

答案 2 :(得分:3)

如果你想在python中使用代码,这是一个非常标准的C方法,它被移植到我使用的python。它完美无瑕,您甚至可以选择文件输出。

import os
import signal
def daemonize(workingdir='.', umask=0,outfile='/dev/null'):
#Put in background
pid = os.fork()
if pid == 0:
    #First child
    os.setsid()
    pid = os.fork() #fork again
    if pid == 0:
        os.chdir(workingdir)
        os.umask(umask)
    else:
        os._exit(0)
else:
    os._exit(0)

#Close all open resources
try:
    os.close(0)
    os.close(1)
    os.close(2)
except:
    raise Exception("Unable to close standard output. Try running with 'nodaemon'")
    os._exit(1)

#Redirect output
os.open(outfile, os.O_RDWR | os.O_CREAT)
os.dup2(0,1)
os.dup2(0,2)

然后,您可以使用信号捕获何时将kill信号发送到程序并很好地退出。来自Python Docs

的示例
import signal, os

def handler(signum, frame):
    print 'Signal handler called with signal', signum
    raise IOError("Couldn't open device!")

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # Disable the alarm

答案 3 :(得分:2)

有些模块可用于守护python脚本。

python-daemon实现了良好的守护程序规范(PEP 3143)。

最近,this module出现在github上,它似乎更加pythonic,易于使用。

答案 4 :(得分:1)

使用init.d样式脚本启动它是一种好方法。您可以使用POSIX信号将其删除...请参阅StackOverflow, Signal handling in Python

答案 5 :(得分:0)

尝试使用此question或更完全接受的解决方案。