Как мне управлять демоном на основе Python в Linux? - PullRequest
5 голосов
/ 01 июня 2010

У меня есть работающая программа на Python, которую я хочу запустить как демон. В настоящее время я делаю это очень хакерским способом, начиная с сеанса screen-d -m name и убивая его с помощью pkill -9 -f name.

В конце концов я пытаюсь переместить это в лучшую систему, которую мы здесь используем (таким образом, Я не хочу изменять программу ), но пока что я ищу более чистого способ сделать это.

Мое текущее мышление - это запустить его как фоновую задачу из скрипта inti.d, но как мне написать часть, чтобы вернуть его обратно?

Ответы [ 6 ]

6 голосов
/ 01 июня 2010

В linux есть утилита start-stop-daemon в составе инструментов init.d.

Он очень гибкий и позволяет использовать разные способы захвата pid вашего сервера.

Существует также файл /etc/init.d/skeleton, который может служить основой для вашего собственного сценария init.d.

Если ваша целевая платформа основана на debian, имеет смысл создать пакет debina для его развертывания, поскольку это также помогает правильно интегрировать демона в остальную систему. И это не так уж сложно (если вы сделали это десять раз раньше; -)

5 голосов
/ 01 июня 2010
3 голосов
/ 01 июня 2010

Если вы хотите сделать это с кодом на python, это довольно стандартный C-метод, который был перенесен на python, который я использую. Он работает безупречно, и вы даже можете выбрать вывод файла.

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

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
2 голосов
/ 06 декабря 2011

Существуют модули, которые можно использовать для демонизации скрипта Python.

python-daemon реализует хорошо работающую спецификацию демона (PEP 3143).

Также этот модуль недавно появился на github, который кажется более питоническим и простым в использовании.

1 голос
/ 01 июня 2010

Хороший способ начать со сценария в стиле init.d. Вы снимаете это с помощью сигналов POSIX ... См. StackOverflow, Обработка сигналов в Python .

0 голосов
/ 01 июня 2010

Попробуйте вопрос или более точно принятое решение.

...