5

我有一个基于 Python 的工作程序,我想作为守护程序运行。目前我正在以一种非常骇人听闻的方式来做这件事,从session 开始,然后用.screen-d -m namepkill -9 -f name

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

我目前的想法是将其作为 inti.d 脚本的后台任务启动,但我如何编写该部分以使其恢复正常?

4

6 回答 6

6

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

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

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

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

于 2010-06-01T16:54:42.973 回答
5

参见PEP 3143——标准守护进程库

于 2010-06-01T16:48:04.043 回答
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)

然后,您可以使用信号来捕获何时向程序发送了终止信号并很好地退出。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
于 2010-06-01T16:56:10.740 回答
2

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

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

这个模块最近也出现在 github 上,看起来更 Python 且易于使用。

于 2011-12-06T04:53:33.113 回答
1

init.d使用样式脚本启动它是一个好方法。您可以使用 POSIX Signals 将其取下来……请参阅StackOverflow,Python 中的信号处理

于 2010-06-01T16:51:04.853 回答
0

试试这个问题或更确切地接受的解决方案。

于 2010-06-01T17:51:39.297 回答