我有一种情况,我想从我的python代码中启动一个upstart作业。要启动的工作本身是用python编写的(这不应该在这里)
以下是我的upstart作业配置(/etc/init/test.conf
)的样子
normal exit 0
respawn
respawn limit 5 300
instance $db
chdir /home/talha/conn/test/
script
exec /usr/bin/python test.py $db
end script
我调用python代码来启动这项工作位于一个Django项目中,该项目被挂钩以通过Apache中的wsgi_mod运行。由于apache在www-data
下运行,我需要使用sudo
来启动upstart。(我已经授予apache运行start
/ stop
的权限。)
我的调用python代码看起来像这样
cmd = "sudo start test db="+ db_name
p = subprocess.Popen(shlex.split(cmd), stderr=subprocess.STDOUT)
现在服务已启动。以下是ps aux
S root 9063 8929 0 80 0 - 4751 poll_s 23:09 ?00:00:00 sudo start
test db=testdb
4 Z root 9064 9063 0 80 0 - 0 exit 00:00:00 [start]<defunct>
0 S root 9066 1 0 80 0 - 9351 poll_s 23:09 ?00:00:00 python
test.py testdb
请注意,pid sudo start test db=testdb
正在运行的流程9063
。这就是问题。它永远不会退出。在此进程上运行strace
表示它已卡在SELECT
的某个位置...还有一个僵尸进程。实际服务python test.py
运行正常但是..
同样当我尝试通过代码停止服务时
cmd = "sudo stop test db="+ db_name
p = subprocess.Popen(shlex.split(cmd), stderr=subprocess.STDOUT)
实际服务被终止,但启动/停止过程被卡住了
4 S root 9063 1 0 80 0 - 4751 poll_s 23:09 ?00:00:00 sudo start
test db=testdb
4 S root 9267 1 0 80 0 - 4751 poll_s 23:11 ?00:00:00 sudo stop
test db=testdb
任何想法/帮助将不胜感激。