我从源代码构建了nginx(我需要Ubuntu发布的版本中没有的功能),并且需要创建SysV类型的服务脚本或Upstart脚本。我走了Upstart路线,认为这会更容易:
# nginx - HTTP server.
description "nginx"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
expect fork
env LD_LIBRARY_PATH=/opt/luajit-2.0/lib
exec /opt/nginx-1.5.12/sbin/nginx
这不起作用。 nginx
几乎立即死亡,奇怪的是,很多其他服务:
[ 2466.050214] init: nginx-1.5.12 main process (8615) terminated with status 2
[ 2466.050224] init: nginx-1.5.12 main process ended, respawning
[ 2581.872143] init: upstart-udev-bridge main process (398) terminated with status 1
[ 2581.872154] init: upstart-udev-bridge main process ended, respawning
[ 2581.872288] init: upstart-socket-bridge main process (536) terminated with status 1
[ 2581.872296] init: upstart-socket-bridge main process ended, respawning
[ 2581.872388] init: upstart-file-bridge main process (937) terminated with status 1
[ 2581.872395] init: upstart-file-bridge main process ended, respawning
尽管有“respawning
”,但nginx
不会被Upstart重生(我可以说,当服务消亡时,Upstart会记录它正在重生)它然后继续什么都不做)。 Upstart似乎认为该服务正在运行(service nginx-1.5.12 start
会出错),所以要实际启动它,我需要先stop
,然后然后 start
它。否则,它就开始了。
我尝试在exec
行添加一些调试,
exec (cd /tmp && mkdir -p nginx-logs && chmod 777 nginx-logs) && /opt/nginx-1.5.12/sbin/nginx > /tmp/nginx-logs/stdout.log 2>/tmp/nginx-logs/stderr.log
仍无法启动,但更有趣的是,永远不会创建/tmp/nginx-logs
。同样,运行service … stop
后跟service … start
工作正常,此时创建nginx-logs
。这似乎表明该行有效。这是以root身份运行的。 /tmp
是世界可写的。目录是绝对的。据我所知,Upstart实际上并没有执行exec
行。
在所有情况下,exec
行都可以手动运行。手动重新启动服务工作正常。这是怎么回事?