使用ubuntu upstart来停止守护进程

Tam*_*mpa 7 ubuntu daemon upstart

我正在使用upstart为生成的nginx python fastcgi脚本创建一个守护进程.如果我使用下面的工作:

sudo start myserver
Run Code Online (Sandbox Code Playgroud)

什么不起作用是:

sudo stop myserver
stop: Unknown instance:
Run Code Online (Sandbox Code Playgroud)

下面是我的conf文件,其中包含停止进程的命令.我假设杀死hte proccess的命令是在停止前脚本?

#!upstart
description "myserver"
author      "Test"

start on startup
stop on shutdown
respawn
#instance

script
    export HOME="/root"

    echo $$ > /var/run/myerver.pid
    exec spawn-fcgi -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001 >> /var/log/myserver.sys.log 2>&1
end script

pre-start script
    # Date format same as (new Date()).toISOString() for consistency
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/myserver.sys.log
end script

pre-stop script
    rm /var/run/myserver.pid
    sudo kill `sudo lsof -t -i:9001`
    echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/myserver.sys.log
end script
Run Code Online (Sandbox Code Playgroud)

Spa*_*apS 8

处理这个的最好方法是告诉spawn-fcgi在前台运行,而不是daemonize.spawn-fcgi的手册页说该-n选项可以做到这一点.然后你可以重写这整个upstart工作:

start on runlevel [2345]
stop on runlevel [016]
respawn    

exec spawn-fcgi -n -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001 >> /var/log/myserver.sys.log 2>&1
Run Code Online (Sandbox Code Playgroud)

请注意,使用Upstart 1.4,您甚至不需要日志方向,因为它默认为"console log",它将具有/var/log/upstart/$UPSTART_JOB.log中的所有输出..所以它应该只是

start on runlevel [2345]
stop on runlevel [016]
respawn

exec spawn-fcgi -n -d /home/ubuntu/workspace/rtbopsConfig/myserver/ -f /home/ubuntu/workspace/rtbopsConfig/myserver/index.py -a 127.0.0.1 -p 9001
Run Code Online (Sandbox Code Playgroud)

值得注意的是,它以root身份运行,但它在端口9001上侦听.所以你可能最好不要像无人一样运行.使用Upstart 1.5(Ubuntu 12.04及更高版本)只需添加:

setuid nobody
setgid nogroup
Run Code Online (Sandbox Code Playgroud)

(您可能必须将nobody/nogroup更改为ubuntu/ubuntu,因为您的文件位于/ home/ubuntu中)

另请注意,这start on startup将无法可靠地工作,因为startup事件发生在文件系统安装之前和网络启动之前.也start on shutdown只是简单不起作用,因为它不是一个真实的事件.查看man upstart-events更多活动.