Какой самый простой способ демонизировать скрипт на Python в Linux? - PullRequest
10 голосов
/ 22 сентября 2008

Какой самый простой способ демонизации скрипта Python в Linux? Мне нужно, чтобы это работало со всеми разновидностями Linux, поэтому он должен использовать только инструменты на основе Python.

Ответы [ 5 ]

21 голосов
/ 22 сентября 2008

См. Стивенс , а также эту длинную ветку на 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

4 голосов
/ 22 сентября 2008
2 голосов
/ 31 августа 2010

Я недавно использовал Туркменбаши :

$ 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)
1 голос
/ 22 сентября 2008

Если вас не интересуют реальные дискуссии (которые, как правило, выходят за рамки темы и не дают авторитетного ответа), вы можете выбрать библиотеку, которая упростит ваш тест. Я бы рекомендовал взглянуть на ll-xist , эта библиотека содержит большой объем жизненно необходимого кода, например, помощник по работе с cron, инфраструктура демонов и (что вам не интересно, но действительно здорово) ) объектно-ориентированный XSL (сам по себе).

0 голосов
/ 22 сентября 2008

Использование grizzled.os.daemonize :

$ easy_install grizzled

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

Чтобы понять, как это работает или сделать это самостоятельно, прочтите обсуждение ActiveState .

...