Я делаю простого новомодного демона.
После Новомодной документации [1] я делаю conf сценарий:
description "Super Daemon"
author "Bastian Baltasar Bux"
start on started dbus
stop on runlevel [06]
expect fork
exec /usr/bin/my-daemon
Сценарий /usr/bin/my-daemon
удар, которые называют Python. Сценарий Python регистрирует информацию в/var/log файле. На том сценарии Python я только делаю a fork
. Но то, когда я проверяю, что ветвлениям нравится, говорит в Новомодном документе [2], в методе говорится, что я делаю дважды ветвления.
С этим всем задание запуска выполняется правильно, но pid показал с upstart my-daemon status
не то же, которое находится в файле журнала. Ошибка появляется, когда я пытаюсь прекратить делать status my-daemon stop
. Та команда не заканчивается, я должен для окончания с Crtl-C.
Я пытался измениться expect fork
кому: expect daemon
но сервисная остановка не делает концов ни один.
Когда могла быть проблема?
Я заметил, что вы уже устранили проблему, исправив строку exec
. Для будущих читателей давайте подведем итоги проблемы и исправления.
Проблема : Запуск разветвленного питона из сценария bash из задания Upstart не отслеживается правильно.
Проблема : expect fork
или expect daemon
не решают проблему.
Решение : Исправить скрипт. Опции:
Переключиться с exec /usr/bin/my-bash-wrapper
на прямой вызов python exec python /path/to/script
(как показано в комментариях выше)
Исправить скрипт bash. Наличие сценария bash с примером содержимого
blockquote>#!/bin/bash python /path/to/script
приводит к тому, что python выполняется отдельно от bash с новым идентификатором процесса. Таким образом, он игнорируется Upstart, поскольку это просто команда, созданная сценарием Bash. Добавление
expect daemon
не помогает, так как в первую очередь игнорируется.Использование сценария bash возможно так же, как вы исправили его в сценарии Upstart. Префикс вызова Python с
exec
заставляет Python работать с тем же PID, что и bash, который отслеживается Upstart. Затемexpect fork
перехватывает fork () в скрипте Python, и Upstart с радостью отслеживает правильный процесс.Таким образом, использование оболочки оболочки bash:
blockquote>#!/bin/bash exec python /path/to/script
делает то же самое.