Задний план:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"
Я построил nginx и хотел бы использовать выскочку для его запуска:
Скрипт выскочки nginx с сайта:
description "nginx http daemon"
start on runlevel 2
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
console owner
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
respawn
Я получаю «неизвестное задание», когда пытаюсь использовать initctl для его запуска, что, как я только что узнал, по-видимому, означает наличие ошибки (что не так с «Ошибка» для описания ошибок?)
Может ли кто-нибудь указать мне правильное направление? Я прочитал документацию, как она есть, и она кажется немного скудной для замены SysV init ... но все, что нужно, просто добавить это задание в список, запустить его и продолжить то, что осталось от моей жизни. .. Какие-нибудь советы?
РЕДАКТИРОВАТЬ: initctl версии init (выскочка 0.6.5)
Я оказывался здесь более одного раза, поэтому я подумал, что дам обновленный ответ, основанный на моем собственном опыте после использования ответов здесь. Особая благодарность @danorton и @orj за их ответы.
Этот сценарий был протестирован на Upstart 1.5, работающем в Ubuntu 12.04 с Nginx 1.0.11 и Passenger 3.0.11. Если вы не используете Passenger, возможно, вам придется поэкспериментировать с post-stop
линия. Обратитесь к кулинарной книге Upstart.
В пустом /etc/init/nginx.conf
добавьте следующие строки (вы можете удалить комментарии, если хотите):
description "nginx http daemon"
start on (filesystem and net-device-up IFACE=lo)
stop on runlevel [!2345]
env DAEMON=/usr/local/nginx/sbin/nginx
env PIDFILE=/var/run/nginx.pid
# Needed to allow Nginx to start, however, the wrong PID will be tracked
expect fork
# Test the nginx configuration (Upstart will not proceed if this fails)
pre-start exec $DAEMON -t
# Ensure nginx is shutdown gracefully
# Upstart will be tracking the wrong PID so the following is needed to stop nginx
post-stop exec start-stop-daemon --stop --pidfile $PIDFILE --name nginx --exec $DAEMON --signal QUIT
# Start Nginx
exec $DAEMON
Я взял сценарий Upstart из Nginx Wiki и изменил его, так как некоторые строки не нужны, вызывают путаницу или не работают.
Вам может потребоваться изменить env DAEMON
и env PID
строки в зависимости от того, где вы установили nginx и пишете PID. PID можно настроить в nginx.
Я пробовал все формы expect
. Только expect fork
вроде работает. С помощью Passenger nginx создает 61 вилку. Upstart требует 0, 1 или 2. Как намекали другие, Upstart будет отслеживать неправильный PID. Я также удалил respawn
поскольку он ничего не делает, вероятно, по той же причине. Некоторые дополнительные сценарии до и после запуска могут исправить это, получив реальный PID. Однако я использую monit для обработки перезапусков, поэтому в этом нет необходимости.
Не используй daemon off
. Это только для разработки. Видеть http://wiki.nginx.org/CoreModule#daemon
Ссылки:
Ты не можешь. По крайней мере, не совсем правильно.
Nginx не порождает своего демона одним из двух способов, которые требуются выскочке, ни через «ожидать вилку», ни через «ожидать демона», поэтому выскочка не может отслеживать главный процесс nginx. Есть некоторые хаки, но у них свои проблемы.
Если вас устраивает тот факт, что выскочка не может отслеживать главный процесс и убивать его при завершении работы, это сработает:
start on local-filesystems \
and (net-device-added INTERFACE=lo) \
and (runlevel [12345])
stop on runlevel [06]
env DAEMON=/usr/sbin/nginx
respawn
respawn limit 10 5
expect daemon
pre-start script
$DAEMON -t
end script
$DAEMON
Вы не можете иметь несколько stop on
директивы в описании вакансии выскочки для Upstart> = 0.5.
И console owner
вероятно, не то, что вам нужно (это делает nginx владельцем системной консоли).
Пытаться:
description "nginx http daemon"
start on runlevel 2
stop on runlevel [016]
console output
exec /usr/sbin/nginx -c /etc/nginx/nginx.conf -g "daemon off;"
respawn
Есть Пример файла конфигурации Upstart в NGINX Вики.
Возможно, вам потребуется изменить путь к двоичному файлу nginx в файле конфигурации.
Этот файл конфигурации отлично работает с Ubuntu 10.04 и nginx 1.0.5.
Я также установил nginx
символическая ссылка в /etc/init.d
указывая на /lib/init/upstart-job
чтобы я мог использовать стандартный service
команда для запуска и остановки nginx
.
Примечание: Если вы устанавливаете Phusion Passenger с NGINX, вам может потребоваться добавить следующий раздел в сценарий конфигурации Upstart:
env PID=/opt/nginx/logs/nginx.pid
post-stop script
start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM
end script
Я нашел это необходимым в моей конфигурации Ubuntu. В противном случае, когда я выдал initctl stop nginx
или service nginx stop
nginx на самом деле не остановился. Я также заметил, что Upstart думал, что у процесса nginx есть PID, который на самом деле был PID одного из процессов Passenger. Итак, очевидно, что NGINX / Passenger немного сбивает с толку Upstart.
Я использую:
description "Nginx HTTP Server"
start on filesystem
stop on runlevel [!2345]
respawn
exec /opt/nginx/sbin/nginx -g "daemon off;"
Остановка на runlevel [!...]
вроде бы более стандартно. Это то, что делают стандартные скрипты ssh / samba. Вам также следует добавить respawn
бит, поэтому он перезапускается, если он умирает. Я тоже не уверен, почему ты хочешь console output
который просто отправляет вывод консоли на стандартный вывод. По умолчанию вывод консоли просто отправляется регистратору.
Вы можете увидеть все строфа документы по Выскочка вики
description "nginx"
start on (net-device-up and local-filesystems)
stop on runlevel [016]
expect fork
respawn
exec /usr/sbin/nginx
Видеть http://geeknme.wordpress.com/2009/10/15/getting-started-with-upstart-in-ubuntu для большего.
Как ни странно, ни один из ответов здесь на самом деле не работает полностью, поскольку они оставляют выскочку в состоянии остановки / уничтожения, что предотвращает работу другого запуска. Это означает, что restart nginx
терпит неудачу.
Ошибка с выскочкой хорошо документирована на https://bugs.launchpad.net/upstart/+bug/406397 и я удивлен, что автор выскочки, похоже, недостаточно заботится о том, чтобы исправить это. Единственное работающее решение, которое я видел, это следующее (украдено из того же отчета об ошибке):
# nginx - Nginx Web Server
#
description "Nginx Web Server"
start on (local-filesystems and
(net-device-up IFACE=eth1 or net-device-up IFACE=eth0) )
stop on runlevel [!2345]
env DAEMON=/usr/local/sbin/nginx
env PID=/var/run/nginx.pid
respawn
pre-start script
$DAEMON -s stop 2> /dev/null || true
$DAEMON -t > /dev/null
$DAEMON
end script
script
sleepWhileAppIsUp(){
while pidof $1 >/dev/null; do
sleep 1
done
}
sleepWhileAppIsUp $DAEMON
end script
post-stop script
if pidof > /dev/null $DAEMON;
then
$DAEMON -s stop
fi
end script
Преимущество такого написания в том, что работает даже респаун. Недостаток в том, что это некрасивый и неприятный прием.