使用ubuntu upstart来停止守护进程

时间:2012-02-19 03:35:36

标签: ubuntu daemon upstart

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

sudo start myserver

什么行不通:

sudo stop myserver
stop: Unknown instance:

下面是我的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

3 个答案:

答案 0 :(得分:8)

处理此问题的最佳方法是告诉spawn-fcgi在前台运行,而不是daemonize。 spawn-fcgi的手册页说-n选项可以做到这一点。然后你可以改写这整个新手工作:

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

请注意,使用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

值得注意的是,它以root身份运行,但它会侦听端口9001.所以你可能会更好地运行为无人。使用Upstart 1.5(Ubuntu 12.04及更高版本)只需添加:

setuid nobody
setgid nogroup

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

另请注意,start on startup无法可靠地运行,因为startup事件发生在文件系统挂载之前和网络启动之前。同样start on shutdown只是简单无效,因为它不是真实的事件。有关更多活动,请参阅man upstart-events

答案 1 :(得分:2)

我相信您的预停止正在停止服务器,因此当Upstart尝试停止服务器时,没有正在运行的进程停止并且它会给您带来错误。

答案 2 :(得分:0)

如果你守护你的进程你需要使用expect守护进程或期望fork线,以便upstart知道跟踪新的pid。

例如: 在启动时开始 停止关机 重生 期待守护进程

文档可以在upstart cookbook中找到: http://upstart.ubuntu.com/cookbook/#expect-daemon http://upstart.ubuntu.com/cookbook/#expect-fork

相关问题