Ubuntu upstart将挂起启动/停止/等

Joh*_*hty 3 python ubuntu upstart python-daemon start-stop-daemon

我在Ubuntu上有几个服务,它们将开始使用'upstart'.它们按照要求工作,但是当我使用'stop/start/restart {myservice}'时它将挂起(但会按要求执行).

我知道它与分叉有关.

我的服务是python脚本,它将在启动时创建新线程.一个脚本将创建1个新线程(并将继续在主线程上运行),第二个脚本将创建2个新线程并继续在主线程上运行,第三个将不创建新线程.

所有这些都挂在命令上.

所有在/ etc/init中使用相同的代码如下:

description "my service"
version "1.0"
author "my name, 2013"

expect fork

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


chdir <to script dir>

exec /usr/bin/python ./scriptname/
Run Code Online (Sandbox Code Playgroud)

您认为可能是什么问题?'fork'与创建新线程有什么关系吗?

Chr*_*ell 10

我认为你在使用linux forking在python中创建线程感到困惑.Python将在它运行时管理自己的线程(假设你使用常规构造),从upstarts看来它只监视你已经开始运行的python进程 - 应该设置python来管理自己的子进程.

可能的解决方案1

尝试expect完全删除该条款,然后重新启动(您必须重新启动,因为upstart可能正在跟踪不存在的PID).

我看到这个开始/停止当upstart由于不正确而跟踪不存在的PID时expect,这通过删除期望和重新启动来解决.您可以通过执行来诊断这一点,status myservice并且upstart将报告被停止以及 PID.(对于无法重启的其他用户,您也可以使用此脚本)

可能的解决方案2

exec su root -c "/usr/bin/python ./scriptname/"如果python /您的程序试图访问仅为certian用户存在的环境变量,则使用(或其他一些用户)设置用户将解决问题(默认情况下,upstart具有非常少的环境变量)

注意

您应该尝试查看输出以帮助您进行调试.在现实生活中你可能会管道,logger但是修改你的脚本,/usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1然后查看内容将帮助你现在.