7

我正在使用 upstart 为衍生的 nginx python fastcgi 脚本创建一个守护进程。如果我使用以下方法,它可以工作:

sudo start myserver

什么不起作用是:

sudo stop myserver
stop: Unknown instance:

下面是我的 conf 文件,其中包含用于停止进程的命令。我假设杀死 hte proccess 的命令在 pre-stop 脚本中?

#!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
4

3 回答 3

8

处理这个问题的最好方法是告诉 spawn-fcgi 在前台运行,而不是守护进程。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,您甚至不需要日志方向,因为它默认为“控制台日志”,所有输出都在 /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更多活动。

于 2012-09-07T19:13:39.383 回答
2

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

于 2012-09-15T14:06:56.980 回答
0

如果您对进程进行守护进程,则需要使用 expect 守护进程或 expect fork 行,以便新贵知道跟踪新的 pid。

例如:启动时启动 关机时停止 respawn 期望守护进程

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

于 2015-12-16T09:02:14.960 回答