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

Следуя за этим вопросом, я записал простой новомодный сервис (/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, который включает новомодное обновление, но эта проблема все еще происходит.

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

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

37
задан 13 April 2017 в 15:23

12 ответов

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

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/

. / вики / отладка

0
ответ дан 13 April 2017 в 15:23

Вероятно, здесь происходит то, что 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.]

0
ответ дан 13 April 2017 в 15:23

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

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

Между запуском и остановкой службы 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

0
ответ дан 13 April 2017 в 15:23

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

sudo apt-get install chkconfig
sudo chkconfig pms on

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

0
ответ дан 13 April 2017 в 15:23

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

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

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

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

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

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

0
ответ дан 13 April 2017 в 15:23

В моем случае сервис upstart зависел от скрипта, расположенного в vagrant synced folder . Решил проблему, используя следующую строку:

start on vagrant-mounted

Дополнительная информация: http://razius.com/articles/launching-services-after-vagrant-mount/

0
ответ дан 13 April 2017 в 15:23

У меня было подобное, "никакие не запускают" проблему, когда я понял, что мой сценарий зависел от файла, который был в моем доме, и дом не был доступен, потому что был crypted со стандартным механизмом человечности (.Private).

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

1
ответ дан 13 April 2017 в 15:23

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

запускается на монтируемом vagrant

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

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
ответ дан 13 April 2017 в 15:23

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

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

respawn
respawn limit 10 10
0
ответ дан 13 April 2017 в 15:23

Ваш домашний каталог на 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 всегда показывает работу сети как остановленную.

0
ответ дан 13 April 2017 в 15:23

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

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
0
ответ дан 13 April 2017 в 15:23

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

start on runlevel [2345]
0
ответ дан 13 April 2017 в 15:23

Другие вопросы по тегам:

Похожие вопросы: