我有一个基于Python的程序,我想作为守护进程运行。目前,我正以非常强硬的方式在screen
-d -m name
会话中启动它并使用pkill -9 -f name
将其删除。
最终我不得不把它移到我们在这里使用的更好的系统(因此我不愿意修改程序)但是在此期间,我正在寻找一个更清洁的方法。
我目前的想法是从inti.d脚本开始作为后台任务,但是如何编写该部件以将其恢复原状?
答案 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或更完全接受的解决方案。