2010-06-01 4 views
5

나는 데몬으로 실행하고 싶은 Python 기반의 작업 프로그램을 가지고있다. 현재 나는 screen-d -m name 세션으로 세션을 시작하고 pkill -9 -f name으로 세션을 종료하는 매우 위험한 방식으로 작업하고 있습니다.Linux에서 Python 기반 데몬을 어떻게 관리합니까?

궁극적으로 저는 이것을 우리가 여기서 사용하는 더 나은 시스템으로 옮겨야 만합니다 (따라서 ). 프로그램을 수정할 의향이 없습니다. 그러나 중간에, 나는 더 깨끗한 방법을 찾고 있습니다. 이.

현재 나의 생각은 inti.d 스크립트에서 백그라운드 작업으로 시작하지만 어떻게 다시 작성해야합니까?

답변

1

참조하십시오. 당신은 POSIX 신호로 그것을 내린다. ... StackOverflow, Signal handling in Python을 보라.

+0

나는 그것을 모두 죽일 수 있지만 걱정하지 마라. 나는 그 PID를 정확하게 찾는 법을 모른다. – BCS

+0

@BCS :'-9'는 종종 ... * 잔인 함 (용서할 것)입니다. [kill -9] (http://speculation.org/garrick/kill-9.html)를 참조하십시오. PID를 찾으면 스크립트는'/ var/run'에 pidfile을 만들거나'argv [0]'에'pkill '과 함께 사용할 이름을 쉽게 지정할 수있는 lib를 사용할 수 있습니다. –

6

리눅스에서는 init.d 도구의 일부로 start-stop-daemon 유틸리티가 있습니다.

매우 유연하며 서버의 PID를 캡처하는 다양한 방법을 허용합니다.

자신의 init.d 스크립트의 기초가 될 수있는 /etc/init.d/skeleton 파일이 있습니다.

대상 플랫폼이 데비안 기반이라면 debian 패키지를 만들어 배포하는 것이 좋습니다. 데비안 패키지를 배포하면 시스템의 나머지 부분에 데몬이 제대로 통합 될 수 있습니다. 그리고 너무 복잡하지 않습니다. (전에 10 번 해본 적이 있다면 ;-)

+0

좋은 물건처럼 보입니다. – BCS

3

파이썬으로 코드를 작성하려면이 코드는 제가 사용하는 파이썬으로 이식 된 꽤 표준적인 C- 메소드입니다. 완벽하게 작동하며 파일 출력을 선택할 수도 있습니다.

import os 
import signal 
def daemonize(workingdir='.', umask=0,outfile='/dev/null'): 
#Put in background 
pid = os.fork() 
if pid == 0: 
    #First child 
    os.setsid() 
    pid = os.fork() #fork again 
    if pid == 0: 
     os.chdir(workingdir) 
     os.umask(umask) 
    else: 
     os._exit(0) 
else: 
    os._exit(0) 

#Close all open resources 
try: 
    os.close(0) 
    os.close(1) 
    os.close(2) 
except: 
    raise Exception("Unable to close standard output. Try running with 'nodaemon'") 
    os._exit(1) 

#Redirect output 
os.open(outfile, os.O_RDWR | os.O_CREAT) 
os.dup2(0,1) 
os.dup2(0,2) 

그런 다음 신호를 사용하여 프로그램에 강제 종료 신호를 보내고 종료 할 때 신호를 사용할 수 있습니다. Python Docs

import signal, os 

def handler(signum, frame): 
    print 'Signal handler called with signal', signum 
    raise IOError("Couldn't open device!") 

# Set the signal handler and a 5-second alarm 
signal.signal(signal.SIGALRM, handler) 
signal.alarm(5) 

# This open() may hang indefinitely 
fd = os.open('/dev/ttyS0', os.O_RDWR) 

signal.alarm(0)   # Disable the alarm 
+0

이중 포크 방식은 매력처럼 작동합니다! – pygabriel

0

의 예는이 question 이상의 정확히 받아 해결책을 시도해보십시오.

+0

나는 프로그램의 내부와 정말로 진절머리 나게하지 않을 것이다. 지옥 나는 오히려 지금보다는 내가 사용하고있는 것을 유지하고 싶습니다. – BCS

+0

가져올 수있는 경우 실제로 프로그램을 변경할 필요가 없습니다. Joust는 deamon-example에서 메인을 임포트합니다. Run 메소드, (while 루프 대체). – Ib33X

2

파이썬 스크립트를 대몬 화하는 데 사용할 수있는 모듈이 있습니다.

python-daemon은 잘 작동하는 데몬 사양 (PEP 3143)을 구현합니다.

또한 this module 최근에 파이썬 스하고 사용하기 쉬운 것으로 보이는 github에 나타났습니다.

관련 문제