Linux에서 Python 스크립트를 데몬화하는 가장 간단한 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/115974

  •  02-07-2019
  •  | 
  •  

문제

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 (그 자체로 존재할 것입니다).

사용 grizzled.os.daemonize:

$ easy_install grizzled

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

이것이 어떻게 작동하는지 이해하거나 직접 수행하려면 다음을 읽어보세요. ActiveState에 대한 토론.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top