我有一个基于 Python 的工作程序,我想作为守护程序运行。目前我正在以一种非常骇人听闻的方式来做这件事,从session 开始,然后用.screen
-d -m name
pkill -9 -f name
最终我不得不将它转移到我们在这里使用的更好的系统(因此我不愿意修改程序),但在此期间,我正在寻找一种更清洁的方法来做到这一点。
我目前的想法是将其作为 inti.d 脚本的后台任务启动,但我如何编写该部分以使其恢复正常?
在 linux 上有一个start-stop-daemon实用程序作为 init.d 工具的一部分。
它非常灵活,允许以不同的方式捕获服务器的 pid。
还有一个文件 /etc/init.d/skeleton 可以作为您自己的 init.d 脚本的基础。
如果您的目标平台是基于 debian 的,那么创建一个 debina 包来部署它是有意义的,因为它还有助于将守护程序正确集成到系统的其余部分中。而且它并不太复杂(如果你以前做过十次的话;-)
如果你想用 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)
然后,您可以使用信号来捕获何时向程序发送了终止信号并很好地退出。Python 文档中的示例
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
init.d
使用样式脚本启动它是一个好方法。您可以使用 POSIX Signals 将其取下来……请参阅StackOverflow,Python 中的信号处理。
试试这个问题或更确切地接受的解决方案。