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

37

Следуя этом вопросе , я написал простой upstart service ( /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 . Выход cat /var/log/syslog | grep init слишком длинный, чтобы разместить его в вопросе, но вы его просмотрите здесь .

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

задан Kent Boogaart 24.09.2011 в 14:23
источник

12 ответов

18

Я бы рекомендовал увеличить объемность задания, например. используя записи перед запуском / пост-стартами.

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

Дополнительная информация на Ссылка

Также посмотрите Ссылка

    
ответ дан Clausi 24.10.2011 в 14:13
14

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

    
ответ дан Mark Russell 24.09.2011 в 17:58
3

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

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

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

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

Попробуйте изменить стартовую строфу на

start on started networking

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

start on net-device-up IFACE=eth0

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

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

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

    
ответ дан Ciaran Liedeman 26.10.2011 в 16:37
3

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

start on runlevel [2345]
    
ответ дан Laurynas 02.03.2013 в 12:21
3

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

start on runlevel [2345]

без каких-либо net-device-up или started networking stuff

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

# MyApp

description     "MyApp"
author          "me"

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

respawn

exec /usr/bin/myapp 2>> /var/logs/myapp.log
    
ответ дан Daniele B 22.05.2014 в 22:11
1

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

sudo apt-get install chkconfig
sudo chkconfig pms on

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

ответ дан Oxwivi 26.10.2011 в 17:26
1

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

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

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

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

Он по-прежнему не работает.

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

    
ответ дан Kent Boogaart 26.10.2011 в 18:54
1

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

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

ответ дан alessandro 01.05.2013 в 23:31
1

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

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

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

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

Благодаря ссылке за указание, что initctl list всегда показывает, что работа в сети прекращена.

    
ответ дан user94311 03.10.2012 в 18:54
0

В моем случае служба выскочки зависела от сценария, расположенного в брандмауэр-синхронизированной папке . Решите проблему, используя следующую строку:

start on vagrant-mounted

Дополнительная информация: Ссылка

    
ответ дан xuhcc 19.05.2015 в 15:09
0

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

  

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

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

Ссылка

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

$ 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

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

    
ответ дан Ian E 29.10.2015 в 03:09
0

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

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

respawn
respawn limit 10 10
    
ответ дан MSS 25.12.2016 в 15:11