擅长:python、mysql、java
<p>我认为你把用python创建线程和linux分叉混淆了。Python将在运行时管理自己的线程(假设您使用的是常规构造),从upstarts视图来看,它只监视已经启动的正在运行的Python进程-Python应该设置为管理自己的子进程。</p>
<h3>可能的解决方案1</h3>
<p><strong>尝试完全删除<code>expect</code>子句,然后重新启动</strong>(必须重新启动,因为upstart可能正在跟踪不存在的PID)。</p>
<p>当upstart由于一个不正确的<code>expect</code>而跟踪一个不存在的PID时,我看到这个启动/停止挂起,这是通过删除expect并重新启动来解决的。您可以通过执行<code>status myservice</code>来诊断此问题,upstart将报告停止<em>以及</em>一个PID。(对于不能重新启动的其他用户,您也可以使用<a href="https://raw.github.com/ion1/workaround-upstart-snafu/master/workaround-upstart-snafu">this script</a>)</p>
<h3>可能的解决方案2</h3>
<p>使用<code>exec su root -c "/usr/bin/python ./scriptname/"</code>设置用户(或某些其他用户)可以解决python/程序试图访问仅存在于certian用户的环境变量时的问题(upstart在默认情况下具有非常少的环境变量集)</p>
<h3>注</h3>
<p>您应该尝试查看输出以帮助调试。在现实生活中,您可以通过管道连接到<code>logger</code>,但是将脚本修改为类似<code>/usr/bin/python ./scriptname/ >> /home/myuser/output.log 2>&1</code>的内容将有助于您现在查看内容。</p>