Linux에서 Python 스크립트를 데몬화하는 가장 간단한 방법은 무엇입니까?
문제
Linux에서 Python 스크립트를 데몬화하는 가장 간단한 방법은 무엇입니까?이것이 Linux의 모든 버전에서 작동해야 하므로 Python 기반 도구만 사용해야 합니다.
해결책
보다 스티븐스 그리고 이것도 활성 상태의 긴 스레드 나는 개인적으로 이것이 대부분 부정확하고 장황하다고 생각하여 다음과 같은 결론을 내렸습니다.
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('/')
당신은 또한 사용할 수 있습니다 안돼 하지만 그건 잘 안 되네 파이썬의 하위 프로세스 모듈
다른 팁
나는 최근에 사용했습니다 투르크멘바시 :
$ 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)
실제 토론(주제에서 벗어나 권위 있는 답변을 제공하지 않는 경향이 있음)에 관심이 없다면 취향에 맞는 라이브러리를 선택할 수 있습니다.나는 살펴 보는 것이 좋습니다 ll-xist, 이 라이브러리에는 크론 작업 도우미, 데몬 프레임워크 등 생명을 구하는 많은 양의 코드가 포함되어 있습니다(당신에게는 흥미롭지 않지만 정말 훌륭합니다). 객체지향 XSL (그 자체로 존재할 것입니다).
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
이것이 어떻게 작동하는지 이해하거나 직접 수행하려면 다음을 읽어보세요. ActiveState에 대한 토론.
제휴하지 않습니다 StackOverflow