2012-05-11 3 views
0

У меня есть сценарий Jython, который я запускаю как демон. Он запускается, регистрируется на сервере и затем переходит в цикл, который проверяет, что обрабатывает, обрабатывает их, а затем спит в течение 5 секунд.правильный способ остановить процесс демона

У меня есть задание cron, которое проверяет каждые 5 минут, чтобы убедиться, что процесс запущен, и снова запускает его, если нет.

У меня есть другое задание cron, которое раз в день перезапускает процесс независимо от того, что. Мы делаем это, потому что иногда подключение демона к серверу иногда закручивается, и нет способа сказать, когда это произойдет.

Проблема, с которой я столкнулась с этим «решением», - это 2-я работа cron, которая убивает процесс и запускает другой. Его хорошо, если он убит во время сна, но могут произойти плохие вещи, если демон находится в середине обработки вещей, когда он убит.

Каков правильный способ остановить процесс демона ... вместо того, чтобы просто убить его?

Есть ли стандартная практика для этого вообще, на Python или на Java? В будущем я могу перейти на чистый Python вместо Jython.

Благодаря

+0

Что вы подразумеваете под словом «соединение демона с сервером иногда закручивается»? – Jordan

ответ

1

Вы можете отправить SIGTERM первый перед отправкой SIGKILL при завершении процесса и получить сигнал с помощью сценария Jython.

Например, отправьте SIGTERM, которые могут быть получены и обработаны вашим скриптом, и если в течение определенного периода времени ничего не происходит, вы можете отправить SIGKILL и принудительно убить процесс.

Дополнительную информацию об обработке событий см. В документации модуля signal.

Кроме того, пример, который может быть удобно (использует atexit крюк):

#!/usr/bin/env python 

from signal import signal, SIGTERM 
from sys import exit 
import atexit 

def cleanup(): 
    print "Cleanup" 

if __name__ == "__main__": 
    from time import sleep 
    atexit.register(cleanup) 

    # Normal exit when killed 
    signal(SIGTERM, lambda signum, stack_frame: exit(1)) 

    sleep(10) 

Взятые из here.

+0

Спасибо ... это работает и от Jython. –

0

Обычный способ типа Linux для этого - отправить сигнал на ваш длительный процесс, который висит. Вы можете справиться с этим с помощью встроенной библиотеки сигналов Python.

http://docs.python.org/library/signal.html

Таким образом, вы можете отправить SIGHUP вашему 1-приложение с вашего 2-го приложения, и обрабатывать его в первый основанный на ли вы в состоянии, где это нормально для перезагрузки.

+0

Спасибо! Пример Петра «просто работает», но я буду ссылаться на эту документацию, если у меня возникнут проблемы или мне соскучиться ;-) –

Смежные вопросы