背景:
DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.04 DISTRIB_CODENAME=lucid DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"
我已经build立了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初始化替代似乎很less见……但无论是只需要将这个工作添加到列表中,运行它,继续我的生活。 ..任何提示?
编辑:initctl版本init(暴发0.6.5)
在Upstart> = 0.5的暴发作业描述中,您不能有多个stop on指令。
而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
我在这里结束了不止一次,所以我想在这里使用答案后,根据自己的经验提供一个更新的答案。 特别感谢@danorton和@orj的答案。
这个脚本已经在Ubuntu 12.04上运行的Upstart 1.5上testing过了,Nginx 1.0.11和Passenger 3.0.11。 如果您不使用乘客,则可能需要使用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
我已经从Nginx Wiki中取得了Upstart脚本,并将其调整为不需要的行数,导致混乱或不起作用。
您可能需要更改env DAEMON和env PID行,具体取决于您安装nginx的位置并正在编写PID。 PID可以在nginx中configuration。
我尝试了各种expect 。 只有expect fork似乎工作。 乘客nginx创build61叉。 暴发户需要0,1或2.正如其他人所暗示的,暴发户将跟踪错误的PID。 我也删除了respawn因为它没有做任何事情,可能是因为同样的原因。 一些额外的前/后启动脚本可能能够通过抓住真正的PID来解决这个问题。 但是,我使用monit来处理重新启动,所以不需要它。
不要使用daemon off 。 这仅用于开发。 请参阅http://wiki.nginx.org/CoreModule#daemon
参考文献:
你不能。 至less不正确,无论如何。
Nginx并没有通过“expect fork”或“expect守护进程”的方式产生它的守护进程,所以upstart无法跟踪master nginx进程。 有一些黑客,但他们有自己的问题。
如果你没事的话,那么暴发户无法跟踪主进程并在closures时杀死它,这将起作用:
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
NGINX Wiki中有一个Upstartconfiguration文件示例 。
您可能需要调整configuration文件中nginx二进制文件的path。
Ubuntu 10.04和nginx 1.0.5这个configuration文件对我来说工作正常。
我还在/etc/init.d安装了一个指向/lib/init/upstart-job的nginx符号链接,这样我就可以使用标准service命令来启动和停止nginx 。
注意:如果您使用NGINX安装Phusion Passenger,则可能需要将以下节添加到Upstartconfiguration脚本中:
env PID=/opt/nginx/logs/nginx.pid post-stop script start-stop-daemon --stop --pidfile $PID --name nginx --exec $DAEMON --signal TERM end script
我在我的Ubuntuconfiguration中发现了这个必要的。 否则,当我发出initctl stop nginx或service nginx stop nginx实际上并没有停止。 我也注意到Upstart认为nginx进程有一个PID,它实际上是一个Passenger进程的PID。 所以很显然,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脚本的function。 你也应该添加respawn位,这样它会重新启动,如果它死了。 我也不知道你为什么要console output ,只是发送控制台输出到标准输出。 默认行为是简单地发送控制台输出到logging器。
你可以在Upstart wiki上看到所有的节文档
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有详细的logging,我很惊讶,暴发户的作者似乎不足以解决这个问题。 我见过的唯一解决scheme是以下(从相同的错误报告中窃取):
# 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
这样写的优点是即使重生也能工作。 缺点是它很丑,很讨厌。