Почему мой сервис upstart не запускается при загрузке системы?

37

Исходя из этого вопроса , я написал простой сервис upstart ( /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

Это, очевидно, просто дает мне что-то искать. Я проверил это, запустив службу сам, а затем проверив start.log . Затем я удалил start.log и перезагрузил компьютер. После перезагрузки его там не было, поэтому кажется, что выскочка определенно не запускает мой сервис. Я полагаю, что он мог умереть на более раннем этапе процесса, но это кажется довольно маловероятным, учитывая простоту всего этого.

ОБНОВЛЕНИЕ 2 : Я только что обновил до 11.10, который включает в себя обновление upstart, но эта проблема все еще возникает.

ОБНОВЛЕНИЕ 3 : По запросу я загрузился с --debug. Вывод cat /var/log/syslog | grep initслишком длинный, чтобы поместить его в вопрос, но вы смотрите его здесь .

ОБНОВЛЕНИЕ 4 : Больше журналов, на этот раз конф выскочка включен в верхней части. Беги 1 и беги 2 .

Кент Бугаарт
источник
Вы уверены, что сценарий не был выполнен? Сообщение остановки / ожидания pms означает, что задание upstart было выполнено и все команды завершились нормально.
организовать
Добавьте вывод cat /var/log/syslog | grep initпосле включения загрузки журнала для upstart с помощью инструкций в Upstart Debugging
Ciaran Liedeman
@ Anarci: пожалуйста, смотрите обновление 3 в моем вопросе.
Кент Бугаарт
Большинство пользователей не дадут такого адреса электронной почты, вместо этого предоставьте ссылку на сайт для
вставки,
@ Anarci: сделано - пожалуйста, смотрите мой вопрос.
Кент Boogaart

Ответы:

19

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

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/Debugging

Clausi
источник
Это действительно заставляет меня задуматься. Я перепробовал дюжину разных вещей в конце вашего поста. Все потерпели неудачу с различными непонятными сообщениями в журналах. Моя последняя попытка привела к тому, что основной процесс init: pms (1329) завершился со статусом 143 , что для меня ничего не значит. Я вижу, что PMS.sh даже не запускается, потому что первое, что он делает, - это запись в собственный журнал, а эта запись в журнале отсутствует. Я вижу свои предварительные выходные данные, которые говорят мне, что целевой файл существует и является исполняемым. Я подберу это снова завтра, но если у вас есть какие-либо идеи, я бы хотел их услышать. Спасибо.
Кент Boogaart
привет @KentBoogaart, похоже, у тебя та же проблема. Вы нашли решение?
Даниэле Б
@KentBoogaart У меня такая же проблема, как и у вас? Удачи тебе?
Мевин Бабу
14

Вероятно, здесь происходит то, что pms запускается до того, как появятся ваши сетевые адаптеры, и, возможно, даже до появления петлевого адаптера (вот так). Предполагая, что мы говорим о 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.]

Марк Рассел
источник
Это звучало как трюк, но это не сработало. Я только loи , eth0но я использовал свое второе предложение: start on filesystem and net-device-up IFACE=eth0. Все равно не идет после перезагрузки. Я только что заметил кое-что в журнале PMS, которое может быть лидером. Я расследую и вернусь ...
Кент Boogaart
Это интересно. Одна вещь, которую я не упомянул, это то, что я попробовал ваш оригинальный скрипт, и он работал при загрузке для моей машины. Я объяснил это просто удачей на жеребьевке (то есть в моем состоянии гонки победила хорошая машина, а в вашей победила плохая машина). Я действительно не вижу, какую еще зависимость мы здесь упускаем. Weird.
Марк Рассел
2
Поскольку вы можете запустить его после загрузки, у нас должна отсутствовать другая зависимость от службы. Один грязный хак, который может сработать (но не осветит нас вообще), это просто sleep 10вставить - или выше - в «сценарий предварительного запуска» перед выполнением сценария оболочки.
Марк Рассел
Извините, Марк, но мы на одной странице. Я пробовал сон 10 штук уже в предстартовом скрипте. Нет идти Затем я попытался полностью удалить файл debug.log и перезагрузиться. После загрузки у меня был тот же статус службы и нет файла debug.log, так что я не уверен, что PMS вообще работает. Есть ли простой способ диагностировать это? Если я изменю PMS.sh, чтобы выложить какой-то вывод, куда он пойдет? Я полагаю, я всегда мог бы направить его в свой собственный файл - мог бы сделать это дальше.
Кент Бугаарт
Я только что обновил свой вопрос с дополнительной информацией.
Кент Бугаарт
3

После изучения вашего системного журнала процесс pms начинается без ошибок, но затем через короткое время его цель меняется с начала на остановку, означая, что он убит.

Это немного странно, потому что вы добавили предложение repsawn, поэтому он должен попытаться начать снова после его остановки, но это не происходит. Я предполагаю, что вы удалили пункт о респауне.

Между запуском и остановкой службы pms запускаются только 2 службы ufw и сетевой интерфейс (eth0), а 1 запускается udev-fallback-graphics.

Кажется, что вы обрабатываете pms запускается параллельно. К сожалению, выскочка документации немного туманна относительно точных различий между start on ...vanilla и start on starting ...and start on started ....

Попробуйте изменить свой стартовый раздел на

start on started networking

или просто слишком

start on net-device-up IFACE=eth0

Вывод журнала немного странный, так как событие net-device-up наступает намного позже, но pms запускается раньше него.

Это должно гарантировать, что ваш процесс запускается только после того, как все настройки сети завершены, т.е. задание не только началось, но и завершилось.

Также не следует полностью доверять выводу журнала, в начале процесса загрузки вывод журнала в любой файл не всегда работает. Смотрите ответ в Отладка Upstart

Кьяран Лидеман
источник
3

Удалось исправить подобную проблему, используя вместо этого start on runlevel:

start on runlevel [2345]
Laurynas
источник
3

У меня была та же проблема, и в конце концов я решил ее просто :

start on runlevel [2345]

без каких- net-device-upлибо started networkingвещей

Это полный сценарий выскочки, и он отлично работает:

# MyApp

description     "MyApp"
author          "me"

start on runlevel [2345]
stop on runlevel [016]

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log
Даниэль Б
источник
1

Я сталкивался chkconfigво время обучения RHCSA / CE:

sudo apt-get install chkconfig
sudo chkconfig pms on

Вы можете проверить его справочную страницу Oneiric для более подробной информации о его возможностях.

Oxwivi
источник
1

Я нашел решение для этого, но я не понимаю его. Если я перенесу PMS из- /home/administratorпод /bin/pmsрута в качестве владельца, все будет работать нормально.

Если я оставлю его под собой, /home/administrator/но убедитесь, что root является владельцем всего бара самого /home/administrator/каталога, он все равно не будет работать.

Если я назначу администратора всем владельцем и изменим соответствующую часть моего скрипта на:

sudo su administrator -c '/home/administrator/pms-current/PMS.sh'

Это все еще не работает.

Полагаю, сейчас я создам /home/root/каталог и перенесу туда все, хотя мне бы очень хотелось это полностью понять.

Кент Бугаарт
источник
Так что chkconfigтоже не сработало? Вы пытались дать каталог PMS.shбыл в корень? Если работает только ваше решение, перейдите на страницу панели запуска Upstart и свяжитесь непосредственно с разработчиками.
Oxwivi
И если этого достаточно, чтобы просто переместить, .shто просто оставьте все там и отредактируйте скрипт так, чтобы он указывал на этот каталог (или, возможно, даже измените каталог?).
Oxwivi
Да, я попытался сделать весь каталог PMS владельцем root. Предположительно, это не сработало, потому что / home / administrator / не принадлежит root.
Кент Boogaart
В любом случае это не имеет смысла, я регулярно запускаю скрипты в моем / home каталоге через upstart без проблем, странно.
организовать
Даже незнакомец: я просто попробовал все в / home / root /, который явно принадлежит root. Не сработало Я переместил все обратно в / bin / pms, и это снова заработало. Так что, похоже, попытка запустить PMS из-под / home не работает в моей системе.
Кент Boogaart
1

У меня была похожая проблема «без запуска», когда я понял, что мой скрипт зависел от файла, который был у меня дома, а дом был недоступен, потому что был зашифрован с помощью стандартного механизма Ubuntu (.Private).

start on local-filesystems событие (вероятно) генерируется до завершения процесса расшифровки.

Alessandro
источник
1

Ваш домашний каталог на NFS? Иногда root не может получить доступ к NFS.

Для справки, в моем маленьком тесте только сейчас, 12.04:

  • start on started networkingи start on network-interface-up INTERFACE=eth0 не работает, но

  • start on started network-interface INTERFACE=eth0 делает.

Спасибо http://os4.org/wiki/upstart.html за указание, которое initctl list всегда показывает работу сети как остановленную.

user94311
источник
Ссылка на ссылку не работает.
ОДС
0

Подобно @xuhcc, я пришел сюда, чтобы узнать, почему мой скрипт Vagrant Upstart не запускался. Следующее должно работать:

начать на бродячем

Но не в некоторых сборках из-за следующей ошибки.

https://github.com/mitchellh/vagrant/issues/6074

Обходной путь, указанный в отчете, отлично сработал для меня:

$ cat /etc/init/workaround-vagrant-bug-6074.conf 
# workaround for https://github.com/mitchellh/vagrant/issues/6074
start on filesystem
task

env MOUNTPOINT=/vagrant

script
  until mountpoint -q $MOUNTPOINT; do sleep 1; done
  /sbin/initctl emit --no-wait vagrant-mounted MOUNTPOINT=$MOUNTPOINT
end script

Отлично работал для меня

Ян Е
источник
0

это сработало для меня (мне нужно запустить сервис после iface up):

start on started networking and net-device-up IFACE=wlan1 
stop on shutdown

respawn
respawn limit 10 10
MSS
источник