监视我使用Popen生成的命令的状态

时间:2013-08-03 22:11:36

标签: python

我使用Popen()来生成一个程序?该程序将在程序中显示“文本”吗?

如何监控我生成的程序的状态?如何确定1分钟内是否有任何打印输出,我认为该程序已挂起,我需要终止进程'p'?

# command is my command to run
p = subprocess.Popen(command,
                     stdout=subprocess.PIPE,
                     stderr=subprocess.STDOUT)

1 个答案:

答案 0 :(得分:0)

这主要基于Non-blocking read on a subprocess.PIPE in python

我们使用单独的线程和队列在q.get(timeout=5)部分给出一定时间后检查输出。如果您只想在60秒后终止进程,请将其更改为60。将第一个参数更改为subprocess.Popen为您要运行的相应命令。

import Queue
import subprocess
import threading

def checkStdout(p, q):
    s = p.stdout.read(1)
    if len(s) > 0:
        q.put(s)

def run():
    p = subprocess.Popen(['cat'], stdout=subprocess.PIPE, close_fds=True)
    print 'pid %d started' % p.pid
    q = Queue.Queue()
    t = threading.Thread(target=checkStdout, args=(p, q))
    t.daemon = True
    t.start()
    try:
        canGet = q.get(timeout=5)
        print 'has output'
    except Queue.Empty:
        print 'no output'
        # kill process
        p.kill()

if __name__ == '__main__':
    run()