Контекст python-daemon не запускается при наличии устаревшего файла PID - PullRequest
6 голосов
/ 26 января 2012

Я использую python-daemon, и у меня проблема в том, что когда я kill -9 процесс, он оставляет pidfile (хорошо), и в следующий раз, когда я запускаю свою программу, он не работает, если я уже не удалилpid-файл вручную (не в порядке).

Я перехватываю все исключения для того, чтобы context.close() вызывался перед завершением - когда это происходит (например, на kill) / var / run / mydaemon.pid * файлы удаляются, и последующий запуск демона завершается успешно.Однако при использовании SIGKILL (kill -9) у меня нет возможности вызвать context.close(), и файлы / var / run остаются.В этом случае при следующем запуске моей программы она не запустится успешно - исходный процесс вернется, но демонизированный процесс блокируется в context.open().

Кажется, что python-daemon должен был заметить, чтоесть файл pid для процесса, который больше не существует, и очищает его, но этого не происходит.Я должен делать это вручную?

Примечание: я не использую with, потому что этот код работает на Python 2.4

from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile

context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid"))
context.open()

try:
    retry_main_loop()
except Exception, e:
    pass
context.close()

Ответы [ 2 ]

1 голос
/ 14 мая 2014

Если вы работаете в linux, и блокировки уровня процесса допустимы, читайте дальше.

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

from lockfile.pidlockfile import PIDLockFile
from lockfile import AlreadyLocked

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1)
try:
    pidfile.acquire()
except AlreadyLocked:
    try:
        os.kill(pidfile.read_pid(), 0)
        print 'Process already running!'
        exit(1)
    except OSError:  #No process with locked PID
        pidfile.break_lock()

#pidfile can now be used to create DaemonContext

Редактировать: похоже, что PIDLockFile доступен только для файла блокировки> = 0,9

1 голос
/ 24 февраля 2012

С предоставленным скриптом здесь как вы говорите, файл pid остается на kill -9, но сценарий также корректно очищается при перезапуске.

...