Демон Paster не выключится, потому что не может прочитать собственный pid-файл - PullRequest
3 голосов
/ 24 июня 2011

TL; версия DR : когда я прошу Paster остановить демон, он не может прочитать собственный файл, который он использует для отслеживания своего идентификатора процесса.

более длинная версия:

Я использую Paster (pastescript 1.7.3) на Python 2.7.1 в Windows Vista.

Мой первый сюрприз - простой веб-сайт:

>paster serve development.ini
Starting server in PID 15184.
serving on http://127.0.0.1:5000

Я ожидал найти файл paster.pid в том же каталоге, но я не могу.Странный.Не берите в голову, давайте сделаем это явно, убив этот процесс и начав заново.

>paster serve development.ini --pid-file=my.pid
Starting server in PID 20884.
serving on http://127.0.0.1:5000

На этот раз он создает файл с именем my.pid.В другом командном окне я могу набрать:

 >type my.pid
 20884

Сайт успешно обслуживается, и диспетчер задач подтверждает, что запущен процесс python с PID 20884.

Теперь давайте спросимpaster для сообщения о состоянии демона:

>paster serve development.ini --status --pid-file=my.pid
PID None in my.pid is not running

>type my.pid
20884

Странно.Он утверждает, что PID внутри my.pid равен None, тогда как это не так.

Давайте выключим его.

>paster serve --stop-daemon --pid-file=my.pid
PID in my.pid is not valid (deleting)

>type my.pid
The system cannot find the file specified.

Итак, он попытался прочитать my.pid,не смог прочитать и удалил его в отчаянии.

Пока демон продолжает работать.

Мне нужно вручную убить демона-пастера, что и рекомендует @Lennart Regebro в аналогичный, менее подробный вопрос .Я хочу автоматизировать это как часть моего тестирования, поэтому я надеюсь найти более чистое решение.

Есть предложения?

1 Ответ

2 голосов
/ 24 июня 2011

Из исходного кода скрипта вставки (serve.py), в методе чтения PID:

pid = read_pidfile(pidfile)
if pid:
    try:
        os.kill(int(pid), 0)
        return pid
    except OSError, e:
        if e.errno == errno.EPERM:
            return pid
return None

На POSIX-совместимых платформах, указав 0 в качестве сигнала просто проверяет, активен ли процесс .

Однако в Windows системный вызов kill отсутствует; Python вместо этого будет использовать TerminateProcess. Удалите строку os.kill из сценария Paster или используйте POSIX-совместимую платформу, например Cygwin (слой POSIX поверх Windows) или Linux.

...