背景:
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04 LTS"
我已经构建了 nginx,我想使用 upstart 来启动它:
来自站点的 nginx upstart 脚本:
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(upstart 0.6.5)
答案1
stop on
对于 Upstart >= 0.5,upstart 作业描述中不能包含多个指令。
这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
答案2
我已经来这里不止一次了,所以我想根据自己使用这里的答案后的经验提供一个更新的答案。特别感谢@danorton 和@orj 的回答。
此脚本已在 Ubuntu 12.04 上运行的 Upstart 1.5 上进行了测试,该版本搭载了 Nginx 1.0.11 和 Passenger 3.0.11。如果您不使用 Passenger,则可能需要尝试使用该post-stop
行。请参阅 Upstart cookbook。
在空白处/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 脚本并对其进行了调整,因为其中许多行是不需要的、会引起混淆或者不起作用。
您可能需要根据您安装 nginx 的位置以及写入 PID 的位置来更改env DAEMON
和行。PID 可以在 nginx 中配置。env PID
我尝试了所有形式的expect
。只有expect fork
似乎有效。使用 Passenger nginx 创建 61 个分支。Upstart 需要 0、1 或 2。正如其他人所暗示的那样,Upstart 将跟踪错误的 PID。我还删除了它,respawn
因为它可能出于同样的原因什么也不做。一些额外的启动前/启动后脚本可能能够通过获取真实 PID 来解决这个问题。但是,我使用 monit 来处理重启,所以不需要它。
请勿使用daemon off
。这仅用于开发。请参阅http://wiki.nginx.org/CoreModule#daemon
参考:
答案3
你不能。至少不能正确地做到这一点。
Nginx 不会以 upstart 要求的两种方式(通过“expect fork”或“expect daemon”)生成其守护进程,因此 upstart 无法跟踪主 nginx 进程。有一些 hack 可以做到,但它们也有自己的问题。
如果你不介意 upstart 无法跟踪主进程并在关机时终止它,那么这样做可以奏效:
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
答案4
我用:
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
只将控制台输出发送到 stdout。默认行为是只将控制台输出发送到记录器。
你可以看到所有的节文档Upstart 维基百科