【问题标题】:What would be the simplest way to daemonize a python script in Linux?在 Linux 中守护 Python 脚本的最简单方法是什么?
【发布时间】:2010-09-12 01:44:35
【问题描述】:

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

【问题讨论】:

标签: python scripting daemon


【解决方案1】:

请参阅 Stevenslengthy 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

【讨论】:

  • 有趣。你如何启动/停止守护进程?
  • 妖魔化后我写了一个pidfile
  • 好的,之后我可以在您的示例中使用标准 init.d 脚本,它应该可以解决问题。
  • @FlorianBösch 为什么 nohup 不能很好地与 Python 的 subprocess 模块配合使用?我遇到了同样的问题。当我使用 nohup 时,池不工作。我正在寻找原因。
【解决方案2】:
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果您不关心实际讨论(这往往会偏离主题并且不提供权威的回应),您可以选择一些可以让您更轻松的库。我建议看一下ll-xist,这个库包含大量挽救生命的代码,比如 cron 作业助手、守护程序框架和(你不感兴趣的东西,但真的很棒)object-面向 XSL(ll-xist 本身)。

    【讨论】:

      【解决方案5】:

      使用grizzled.os.daemonize:

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

      要了解其工作原理或自己动手,请阅读the discussion on ActiveState

      【讨论】:

        猜你喜欢
        • 2011-05-21
        • 2019-11-15
        • 1970-01-01
        • 2015-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        相关资源
        最近更新 更多