Как я управляю основанным на Python демоном на Linux?

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

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

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

5
задан BCS 1 June 2010 в 18:15
поделиться

5 ответов

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

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

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

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

6
ответ дан 18 December 2019 в 09:48
поделиться

Если вы хотите сделать это с помощью кода на 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)

Затем, вы можете использовать сигналы, чтобы поймать, когда программе был послан сигнал "kill" и красиво выйти. Пример из 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
3
ответ дан 18 December 2019 в 09:48
поделиться

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

1
ответ дан 18 December 2019 в 09:48
поделиться

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

0
ответ дан 18 December 2019 в 09:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: