2013-06-20 2 views
5

Я пытаюсь демонтировать процесс, используя модуль daemon. Код выглядит примерно так:Python: процесс Daemonizing с PID-файлом

import sys 
import time 
import daemon 
import lockfile 


def do_things(): 
    while True: 
     print "hello" 
     time.sleep(3) 

def main() 
    context = daemon.DaemonContext(stdout=sys.stdout, 
            pidfile=lockfile.FileLock('test.pid')) 

    with context: 
     do_things() 

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

python test.py 

Теперь это время он не должен работать, как прежде экземпляр уже запущен. Оказывается, что второй экземпляр запускается и попадает в цикл (этот не является циклом while в моей тестовой функции). Запуск strace на этом 2-й экземпляр дает следующий результат непрерывно

stat("/some-path-here/[email protected]", {st_mode=S_IFREG|0666, 
st_size=0, ...}) = 0 
select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout) 

link("/some-path-here/[email protected] 4e1a9720.21520", 
"/somepath/test.pid.lock") = -1 EEXIST (File exists) 

И появляется этот след постоянно, пока процесс не будет насильственно убит. Функции lockfile действительно обнаружили наличие существующего файла блокировки, но проблема заключается в том, что программа не выходит из системы. Также мне бы хотелось, чтобы эта ошибка отображалась, что файл pid уже существует.

Как это можно сделать?

ответ

2

ПРИМЕЧАНИЕ: Этот ответ предполагает, что вы используете библиотеку python-daemon.

Библиотека демона поставляется с вспомогательным классом daemonDaemonRunner, который обрабатывает файл pid. Рассматривая внутренности этого, он использует daemon.pidfile.TimeoutPIDLockFile как тип файла блокировки.

Таким образом, это выглядит, как вы можете решить эту проблему, либо:

  • Использование daemon.DaemonRunner (мы обнаружили, что это очень удобно использовать)
  • Измените тип PidFile к daemon.pidfile.TimeoutPIDLockFile.
+0

Я попробовал второй подход, и это дало еще худшие результаты. В рабочем каталоге нет файла pid, и он все еще жалуется на его существование! Я подтвердил через strace – auny

+0

strace дает «open (« test.pid », O_WRONLY | O_CREAT | O_EXCL, 0644) = -1 EEXIST (Файл существует)" – auny

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