Продолжая отэтот вопрос, я написал простую стартовую службу (/etc/init/pms.conf) для моего безголового сервера Ubuntu Server 11.04 следующим образом:
start on filesystem and net-device-up IFACE=eth0
stop on runlevel [016]
respawn
exec /home/administrator/pms-current/PMS.sh
Я могу запустить (или остановить) эту службу по своему желанию из командной строки:
service pms start
И я вижу, что он действительно работает.
Однако, когда я впервые загружаю свою машину, служба не запускается. Если я подключаюсь по SSH и проверяю статус службы, я получаю:
$ service pms status
pms stop/waiting
Мой вопрос: почему это происходит? Почему моя служба не запускается при загрузке?
ОБНОВЛЕНИЕ 1: не уверенный, запускалась ли моя служба и впоследствии умирала или просто не запускалась вообще, я добавил следующее в PMS.sh:
echo "STARTED" > $STARTLOG
Это, очевидно, просто дает мнечто-нибудьискать. Я проверил это, запустив службу самостоятельно, а затем проверивстарт.журнал. Затем я удалилстарт.журнали перезагрузился. После перезапуска его там не было, так что похоже, что upstart определенно не запускает мою службу. Полагаю, он мог умереть на более раннем этапе процесса, но это кажется маловероятным, учитывая простоту всего этого.
ОБНОВЛЕНИЕ 2: Я только что обновился до версии 11.10, которая включает обновление Upstart, но эта проблема все еще возникает.
ОБНОВЛЕНИЕ 3: Как и просили, я загрузился с --debug
. Вывод cat /var/log/syslog | grep init
слишком длинный, чтобы поместить его в вопрос, но вы просмотрите егоздесь.
ОБНОВЛЕНИЕ 4: Еще больше логов, на этот раз upstart conf включен в начало.Пробег 1изабег 2.
решение1
Я бы рекомендовал увеличить детализацию задания, например, используя предстартовые/послестартовые записи.
pre-start script
logger "pre-start for myprog"
end script
post-start script
logger "post-start for myprog"
end script
# and for PMS itself:
script
logger "just before executing PMS"
exec /home/administrator/pms-current/PMS.sh
end script
Дополнительная информация наhttp://upstart.ubuntu.com/cookbook/
Также посмотритеhttp://upstart.ubuntu.com/wiki/Отладка
решение2
Вероятно, здесь происходит то, что pms запускается до того, как запускаются ваши сетевые адаптеры, и, вероятно, даже до того, как запускается адаптер loopback (lo). Если предположить, что мы говорим о PS3 Media Server, то это сетевая служба, и ей, вероятно, не нравится запускаться без доступных интерфейсов.
Попробуйте изменить начальные критерии на:
start on filesystem and net-device-up IFACE!=lo
То есть, запустите после того, как будет запущен любой "реальный" сетевой интерфейс. Однако это может быть неидеально, если следующим интерфейсом будет eth0, PMS запустится, но вы действительно хотите, чтобы PMS использовал wlan0, так не получится. Служба запустится, но она, возможно, не сможет выбрать интерфейс, который вы хотели бы прослушивать. Предполагая, что вы знаете интерфейс, через который собираетесь транслировать, и он не будет меняться, я бы жестко закодировал это в задании, например:
start on filesystem and net-device-up IFACE=wlan0
В Oneiric (11.10) вы можете использовать событие static-network-up
для ожидания всех статически настроенных устройств. Что хорошо, потому что позволяет вам писать сетевые задания без жесткого кодирования интерфейса. [Примечание: под «всеми статически настроенными устройствами» я подразумеваю использование /etc/network/interfaces
вместо NetworkManager. Это не означает статический в смысле статического IP против DHCP.]
решение3
Изучив ваш системный журнал, можно увидеть, что процесс pms запускается без ошибок, но затем через некоторое время его цель меняется с start на stop, что означает его завершение.
Это немного странно, потому что вы добавили пункт repsawn, поэтому он должен попытаться снова запуститься после остановки, но этого не происходит. Так что я предполагаю, что вы удалили пункт respawn.
Между запуском и остановкой службы pms запущены только 2 службы: ufw и сетевой интерфейс (eth0), и 1 — udev-fallback-graphics.
Кажется, что ваш процесс pms запускается параллельно. К сожалению, документация upstart немного туманна относительно точных различий между start on ...
vanilla и start on starting ...
и start on started ...
.
Попробуйте изменить стартовую строфу на
start on started networking
или просто слишком
start on net-device-up IFACE=eth0
Вывод журнала немного странный, так как событие net-device-up происходит намного позже, но pms запускается раньше него.
Это должно гарантировать, что ваш процесс запустится только один раз.всеНастройка сети завершена, т.е. работа не только началась, но и завершена.
Также не доверяйте полностью выводу журнала, на ранних этапах процесса загрузки вывод журнала в любой файл не всегда работает. Смотрите ответ вОтладка Upstart
решение4
У меня была такая же проблема и в конце концов я ее решилпростос:
start on runlevel [2345]
без net-device-up
всяких started networking
вещей
Это полный скрипт upstart, и он работает отлично:
# MyApp
description "MyApp"
author "me"
start on runlevel [2345]
stop on runlevel [016]
respawn
exec /usr/bin/myapp 2>> /var/logs/myapp.log