Каким будет самый простой способ демонирования python script в Linux? Мне нужно, чтобы это работало с каждым вкусом Linux, поэтому он должен использовать только инструменты на основе python.
Каким будет самый простой способ демонтировать python script в Linux?
Ответ 1
Смотрите Stevens, а также этот длинный поток при активизации который я лично обнаружил как в основном неправильный, так и многословный, и я придумал следующее:
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
Ответ 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
Если вы не заботитесь о реальных дискуссиях (которые, как правило, выходят в offtopic и не дают авторитетного ответа), вы можете выбрать некоторую библиотеку, которая упростит ваш вкус. Я бы передумал взглянуть на ll-xist, эта библиотека содержит большой жизненный код, например, cron jobs helper, daemon framework, и (что вам не интересно, но это действительно замечательно) объектно-ориентированный XSL (сам ll-xist).
Ответ 5
Используйте grizzled.os.daemonize:
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
Чтобы понять, как это работает или сделать это самостоятельно, прочитайте обсуждение ActiveState.