在 Linux 中守护 Python 脚本的最简单方法是什么?我需要它适用于各种 Linux,所以它应该只使用基于 python 的工具。
edomaur
问问题
5868 次
5 回答
21
请参阅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 的 subprocess 模块
于 2008-09-22T16:47:31.380 回答
4
于 2008-09-22T16:41:18.137 回答
2
我最近使用了土库曼巴什:
$ 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)
于 2010-08-31T05:43:08.863 回答
1
如果您不关心实际讨论(这往往会偏离主题并且不提供权威响应),您可以选择一些让您更轻松的库。我建议看一下ll-xist,这个库包含大量挽救生命的代码,比如 cron 作业助手、守护程序框架和(你不感兴趣的,但真的很棒)面向对象的 XSL( ll-存在本身)。
于 2008-09-22T19:58:20.313 回答
0
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
要了解其工作原理或自己动手,请阅读有关 ActiveState 的讨论。
于 2008-09-22T16:57:14.277 回答