Я пытаюсь демонтировать процесс, используя модуль 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 уже существует.
Как это можно сделать?
Я попробовал второй подход, и это дало еще худшие результаты. В рабочем каталоге нет файла pid, и он все еще жалуется на его существование! Я подтвердил через strace – auny
strace дает «open (« test.pid », O_WRONLY | O_CREAT | O_EXCL, 0644) = -1 EEXIST (Файл существует)" – auny