擅长:python、mysql、java
<p>如果不知道导致问题的“一个复杂bash脚本”的内容,就有太多的可能性来确定确切的原因。</p>
<p>然而,关注这样一个事实:如果在<code>supervisord</code>下运行Python脚本,那么如果子进程试图从stdin读取,那么它可能会被卡住,或者如果stdin是tty,那么它的行为可能会不同,而tty(我猜)<code>supervisord</code>将从<code>/dev/null</code>重定向。</p>
<p>这个最小的例子似乎能更好地处理这样的情况:我的例子<code>test.sh</code>运行试图从stdin读取的子进程。。。</p>
<pre><code>import os
import subprocess
f = subprocess.Popen(args='./test.sh',
shell=False,
bufsize=0,
stdin=open(os.devnull, 'rb'),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
close_fds=True)
while 1:
s = f.stdout.readline()
if not s and f.returncode is not None:
break
print s.strip()
f.poll()
print "done %d" % f.returncode
</code></pre>
<p>否则,您总是可以回到使用<a href="https://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python">non-blocking read</a>的方式,当您得到最后一个输出行时,它会说“进程完成”,尽管这有点麻烦。</p>