Upstart скрипт не запускается

33

Ubuntu 10.04

Я создал этот скрипт выскочки ( /etc/init/pure-ftpd.conf ):

# pure-ftpd - FTP server

description "Pure-FTPd server"

start on filesystem
stop on runlevel S

respawn
respawn limit 10 5
pid file /var/run/pure-ftpd.pid
console output

pre-start script
    test -x /usr/local/sbin/pure-ftpd || { stop; exit 0; }
end script

exec /usr/local/sbin/pure-ftpd --maxclientsnumber 2 --maxclientsperip 10 --prohibitdotfileswrite --prohibitdotfilesread --noanonymous --chrooteveryone --dontresolve --nochmod --pidfile /var/run/pure-ftpd.pid

Но...

# start pure-ftpd
start: Unknown job: pure-ftpd

а также

# service pure-ftpd start
start: Unknown job: pure-ftpd


В чем проблема?
Нужно ли делать что-то еще?
Нужно ли создавать один скрипт в /etc/init.d?

Хуан Симон
источник
Я встретил ту же проблему. Пожалуйста, попробуйте команду initctl на консоли. Чтобы войти в сеанс консоли, нажмите Ctrl + ALT + F1 и войдите. (Я не могу понять почему, но мне это

Ответы:

26

Обычно это означает, что у вас есть ошибка в .confфайле - например, я не уверен, что pidраздел поддерживается в 10.04, stopне может использоваться в сценарии и т. Д.

Я бы попробовал запустить файл с нуля (только с startи stopт. Д.), А затем медленно создать его, добавляя все больше и больше строк и проверяя его с помощью start pure-ftpd.

Например:

# cat pure-ftpd.conf 
start on filesystem
stop on runlevel S

respawn
respawn limit 10 5

# start pure-ftpd
pure-ftpd start/running

# cat pure-ftpd.conf 
start on filesystem
stop on runlevel S

respawn
respawn limit 10 5
pid file /var/run/pure-ftpd.pid

# start pure-ftpd
start: Unknown job: pure-ftpd
организовать
источник
Информация в вики очень устарела ( upstart.ubuntu.com/wiki ). С другой стороны, версия upstart в Lucid - 0.6.5-8, и файл pid должен поддерживаться: upstart.ubuntu.com/wiki/…
Хуан Симон
1
AFAIK pidстрофа была удалена с версии 0.5.0 2008-08-12 "One of those deaf-mutes". Не используйте это.
организовать
Кто-то знает, где находится обновленная документация?
Хуан Симон
46

Вы также можете запустить, init-checkconfчтобы проверить синтаксис

init-checkconf /etc/init/job.conf
File /etc/init/job.conf: syntax ok
Стефано Гаргиуло
источник
1
Команда не существует в 10.04, но она существует в 12.04.
Марк Стосберг
6
Но он не работает на безголовом сервере Ubuntu 12.04 (пока). См. Bugs.launchpad.net/upstart/+bug/881885
FvD
1
Нашел проблему сразу! - Должен быть встроен в startкоманду, чтобы она давала более информативное сообщение об ошибке ...
AT
26

Во-первых, вы можете проверить, что ваша работа на самом деле известна как выскочка:

sudo initctl list | grep your_job_name

... где your_job_nameимя вашего сценария upstart минус .confрасширение.

Если он не найден, попробуйте перезагрузить конфигурацию, а затем повторно проверить:

sudo initctl reload-configuration

# re-check
sudo initctl list | grep your_job_name

Затем попробуйте снова начать свою работу:

sudo start your_job_name

Если вы не входили в систему /var/log/daemon.logили /var/log/syslogраньше, возможно, у вас есть сейчас.

Марк Стосберг
источник
1
А что, если это покажет, что задание неизвестно для запуска, даже если синтаксис правильный и он находится в / etc / init?
FvD
1
Вы пробовали "sudo initctl reload-configuration", как было предложено? Вы проверяли разрешения, логи, документы?
Марк Стосберг
Я сделал, и сделал снова после прочтения вашего комментария. Даже убедился, что пользователь был системным пользователем (useradd -r). Возможно, может быть что-то не так, не связанное с upstart, поэтому я отправил вопрос разработчикам службы, которую я пытаюсь запустить (это сервер глянцевый, который я пытаюсь запустить при загрузке).
ФВД
1
И это были разрешения в конце концов! несмотря на то, что все выглядело замечательно при перечислении директории, только после chmod 644 initctl поднял скрипт. Еще раз спасибо.
FvD
1
Помните, что your_job_name без конца .conf файла. Мне потребовался час, чтобы узнать.
Марсель
6

Наиболее актуальная ссылка на синтаксис файла задания будет доступна при запуске команды:

man 5 init

в вашей системе. Для Ubuntu 10.04, как вы обнаружили в предыдущем ответе, синтаксис файла pid неверен.

Каждый раз, когда вы получаете сообщение об ошибке «неизвестное задание», полезно проверить журналы (до 11.04, /var/log/daemon.log, 11.04 и выше, все идет в / var / log / syslog)

Вы можете увидеть такую ​​ошибку:

init: /etc/init/test.conf:2: Unknown stanza
SpamapS
источник
3

В любом случае, я здесь, потому что у меня была та же проблема, но мой синтаксис был на 100% правильным.

После некоторой отладки я обнаружил другую проблему, которая может вызвать эту ошибку «Неизвестная работа» :

upstarts использует inotify для отслеживания изменений файла .conf и заданий автоматической установки, это очень круто (для этого вам не нужно что-то вроде update.rc с upstart!), но может быть не идеально, если вы (как и я в этом случае) используете В некоторых программах FTP / SCP GUI для загрузки и редактирования конфигураций на удаленных серверах задание может быть автоматически удалено программой upstart при редактировании файла таким способом.

чтобы исправить просто сделать это (это спасло меня)

touch /etc/init/*

он будет генерировать события inotify, чтобы обновить все выскочки конф.

Стефано Гаргиуло
источник
2

У меня была такая же проблема в моих контейнерах Ubuntu 14.04 Docker. Как оказалось, образ Ubuntu 14.04 (если не другие) для Docker не поддерживает Upstart так же, как полноценная виртуальная машина.

Чтобы ответить на этот вопрос, почему служба не запускается, это потому, что initctl не является реальной программой Upstart: она отображается в / bin / true.

Чтобы проверить, выполните следующие действия для контейнера Ubuntu 14.04 Docker против Vagrant и против капли DigitalOcean

$ ls -al /sbin/initctl

Вы увидите, что initctl отличается от Docker по сравнению с другими.

Ссылка, которая может помочь вам понять. Https://github.com/docker/docker/issues/1024

Джонатан Дж.
источник
2
Столкнулся с той же проблемой с Docker: короче говоря, docker запускает только один процесс за раз, поэтому он не может запустить upstart и что-то еще. Чтобы убедиться, что перезапустить службу, если / когда он умирает, я в конечном итоге с помощью supervisord. PS: вы не должны запускать несколько сервисов в контейнере: весь смысл использования контейнеров состоит в том, чтобы создавать микро сервисы, поэтому
собирайте
1
Я просто побежал в эту статью , и это дает очень хорошие советы о том , как отделить проблемы: blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker который, возможно, даже лучшую стратегию использовать, чем использовать супервизора
MrE