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

时间:2020-03-06 14:32:59  来源:igfitidea点击:

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

解决方案

Nohup

用Python方式创建守护程序

参见史蒂文斯(Stevens)以及在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的子进程模块

使用grizzled.os.daemonize:

$ easy_install grizzled

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

要了解它是如何工作或者自己完成的,请阅读有关ActiveState的讨论。

如果我们不关心实际的讨论(可能会引起话题讨论,并且不提供权威的回应),则可以选择一些库来简化品尝。我建议我们看一下ll-xist,该库包含大量救生代码,例如cron作业助手,守护程序框架和(对我们来说并不有趣,但确实很棒)面向对象的XSL( ll-xist本身)。

我最近用过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)