我在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/
你觉得问题出在哪里?“fork”与创建新线程有关系吗?
我认为你把用python创建线程和linux分叉混淆了。Python将在运行时管理自己的线程(假设您使用的是常规构造),从upstarts视图来看,它只监视已经启动的正在运行的Python进程-Python应该设置为管理自己的子进程。
可能的解决方案1
尝试完全删除
expect
子句,然后重新启动(必须重新启动,因为upstart可能正在跟踪不存在的PID)。当upstart由于一个不正确的
expect
而跟踪一个不存在的PID时,我看到这个启动/停止挂起,这是通过删除expect并重新启动来解决的。您可以通过执行status myservice
来诊断此问题,upstart将报告停止以及一个PID。(对于不能重新启动的其他用户,您也可以使用this script)可能的解决方案2
使用
exec su root -c "/usr/bin/python ./scriptname/"
设置用户(或某些其他用户)可以解决python/程序试图访问仅存在于certian用户的环境变量时的问题(upstart在默认情况下具有非常少的环境变量集)注
您应该尝试查看输出以帮助调试。在现实生活中,您可以通过管道连接到
logger
,但是将脚本修改为类似/usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1
的内容将有助于您现在查看内容。是的。 见http://upstart.ubuntu.com/cookbook/#id160
取决于你的应用程序是使用fork还是使用fork两次或根本不使用,你需要分别使用expect fork、expect deamon或nothing。
相关问题 更多 >
编程相关推荐