什么将是守护进程在Linux的Python脚本最简单的方法?(What would be the s

2019-06-26 10:42发布

什么将是守护进程在Linux的Python脚本最简单的方法? 我需要这个功能兼容Linux系统的每一种滋味,所以应该只使用基于Python的工具。

Answer 1:

见史蒂文斯也该对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,通常的解决办法是PID文件。 这样做,如果你需要一个

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的子模块



Answer 2:

nohup的

创建一个守护进程Python的方式



Answer 3:

我最近使用过土库曼斯坦 :

$ 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)


Answer 4:

如果没有实际的讨论(这往往要offtopic并没有提供权威的回应)关心,你可以选择一些库,这将使您更容易TAST。 我会采取电子书籍看看LL-XIST ,这个库包含大量的挽救生命的代码,如cron作业帮手,守护程序框架,(什么是不感兴趣的你,但真的很棒) 面向对象的XSL( LL-XIST本身)。



Answer 5:

使用grizzled.os.daemonize :

$ easy_install grizzled

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

要理解它是如何工作的,或者做自己,阅读上的ActiveState的讨论 。



文章来源: What would be the simplest way to daemonize a python script in Linux?