Исходя из этого вопроса , я написал простой сервис upstart ( /etc/init/pms.conf ) для моего безголового сервера Ubuntu 11.04 следующим образом: [1114 ]
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 из /home/administrator
в /bin/pms
с владельцем root, все будет работать нормально.
Если я оставлю его в /home/administrator/
, но убедитесь, что root является владельцем всего, кроме самого каталога /home/administrator/
, он все равно не будет работать.
Если я назначу администратора всем владельцем и изменим соответствующую часть моего сценария на:
sudo su administrator -c '/home/administrator/pms-current/PMS.sh'
Он все еще не работает.
Полагаю, сейчас я создам каталог /home/root/
и перенесу туда все, хотя мне бы очень хотелось это полностью понять.
Я бы порекомендовал увеличить детализацию работы, например, с использованием записей до и после запуска.
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/
Вероятно, здесь происходит то, что 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
. Все еще не следуйте за перезагрузкой. I' ve просто заметил что-то в журнале премьер-министров, который может быть выводом. I' ll занимаются расследованиями и возвращаются...
– Mitch Wheat
25.09.2011, 07:29
sleep 10
- или выше - в " предварительно запустите script" прежде exec' луг сценарий оболочки.
– Jonny Boy
25.09.2011, 07:51
У меня была та же проблема, и в конце концов я решил ее просто с помощью:
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
Я сталкивался с chkconfig
во время обучения RHCSA / CE:
sudo apt-get install chkconfig
sudo chkconfig pms on
Вы можете проверить его man-страницу Oneiric для более подробной информации о его возможностях.
После изучения вашего системного журнала процесс 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
У меня была похожая проблема «без запуска», когда я понял, что мой сценарий зависел от файла, который был у меня дома, а дом был недоступен, потому что был зашифрован с помощью стандартного механизма Ubuntu (.Private). [111 ]
start on local-filesystems
событие (вероятно) генерируется до завершения процесса дешифрования.
Ваш домашний каталог на 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
всегда показывает работу сети как остановленную.
В моем случае сервис upstart зависел от скрипта, расположенного в vagrant synced folder . Решил проблему, используя следующую строку:
start on vagrant-mounted
Дополнительная информация: http://razius.com/articles/launching-services-after-vagrant-mount/
Подобно @xuhcc, я пришел сюда, чтобы узнать, почему не запускался мой сценарий Vagrant Upstart. Предполагается, что работает следующее:
запускается на монтируемом vagrant
blockquote>Но не в некоторых сборках из-за следующей ошибки.
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
Отлично сработало для меня