在Linux中守护python脚本最简单的方法是什么?

时间:2008-09-22 16:39:10

标签: python scripting daemon

在Linux中守护python脚本最简单的方法是什么?我需要这适用于Linux的各种风格,因此它应该只使用基于python的工具。

5 个答案:

答案 0 :(得分:21)

请参阅Stevens以及此lengthy thread on activestate,我个人发现这些内容大多不正确且冗长,我想出了这个:

from os import fork, setsid, umask, dup2
from sys import stdin, stdout, stderr

if fork(): exit(0)
umask(0) 
setsid() 
if fork(): exit(0)

stdout.flush()
stderr.flush()
si = file('/dev/null', 'r')
so = file('/dev/null', 'a+')
se = file('/dev/null', 'a+', 0)
dup2(si.fileno(), stdin.fileno())
dup2(so.fileno(), stdout.fileno())
dup2(se.fileno(), stderr.fileno())

如果您需要再次停止该过程,则需要知道pid,通常的解决方案是pidfiles。如果你需要一个

,请这样做
from os import getpid
outfile = open(pid_file, 'w')
outfile.write('%i' % getpid())
outfile.close()

出于安全考虑,您可能会在妖魔化之后考虑其中任何一项

from os import setuid, setgid, chdir
from pwd import getpwnam
from grp import getgrnam
setuid(getpwnam('someuser').pw_uid)
setgid(getgrnam('somegroup').gr_gid)
chdir('/') 

您也可以使用nohup,但这不适用于python's subprocess module

答案 1 :(得分:4)

答案 2 :(得分:2)

我最近使用过Turkmenbashi

$ easy_install turkmenbashi
import Turkmenbashi

class DebugDaemon (Turkmenbashi.Daemon):

    def config(self):
        self.debugging = True

    def go(self):
        self.debug('a debug message')
        self.info('an info message')
        self.warn('a warning message')
        self.error('an error message')
        self.critical('a critical message')

if __name__=="__main__":
    d = DebugDaemon()
    d.config()
    d.setenv(30, '/var/run/daemon.pid', '/tmp', None)
    d.start(d.go)

答案 3 :(得分:1)

如果您不关心实际讨论(这些讨论倾向于偏离主题并且不提供权威响应),您可以选择一些可以让您更轻松的库。我建议看看ll-xist,这个库包含大量的救生代码,比如cron jobs helper,守护进程框架,以及(对你来说不是很有趣,但真的很棒)面向对象的XSL (ll-xist本身)。

答案 4 :(得分:0)

使用grizzled.os.daemonize

$ easy_install grizzled

>>> from grizzled.os import daemonize
>>> daemon.daemonize()

要了解其工作原理或自行完成,请阅读the discussion on ActiveState

相关问题