Python运行批处理文件,如果在设定的时间段内未输出到STDOUT,则将其杀死

时间:2018-07-03 20:11:33

标签: python python-2.7 subprocess python-multithreading

我有一个运行C#应用程序来处理文件的批处理文件(我无法编辑此应用程序)。在整个过程中,它会向控制台写出正在执行的操作。有时会由于文件操作中无法预料的问题而挂起。目标是终止这种C#应用程序及其资源,如果发生的话,然后重新启动它(删除有问题的文件)。

如果该过程需要花费n分钟以上的时间才能关闭并重新启动,我已经可以通过使用超时约束来管理大部分操作。

我想通过定时从C#应用程序写入STDOUT的内容来使其更加智能。因此,如果对STDOUT的最后一次更新是在n分钟前,则可以假定进程已挂起,请进行一些清理并重新启动。

我将以下内容结合在一起,以便将每行输出到STDOUT,并在整个过程达到超时时关闭。它不测量每次输入STDOUT之间的时间。我的感觉是我下面的事情走错了方向,我希望能弄清楚这是否有可能。

我在Windows上使用Python 2.7,但是如果使用Python 3.x可以简化此过程,则可以考虑使用。不一定要找人为我解决这个问题,但至少可以提供一些指导。谢谢!

import subprocess, threading, psutil, os

class Command(object):

def __init__(self,cmd):
    self.cmd = cmd 
    self.process = None

def kill_proc_tree(self, pid, including_parent=True):
    parent = psutil.Process(pid)
    children = parent.children(recursive=True)

    for child in children:
        child.kill()

    psutil.wait_procs(children, timeout=5)
    if including_parent:
        parent.kill()
        parent.wait(5)

def run(self, timeout):

    def target():
        print "Thread Started"
        self.process = subprocess.Popen(self.cmd, stdout=subprocess.PIPE)

        while self.process.poll() is None:
            line = self.process.stdout.readline()
            print line.rstrip()

        print "Thread Finished"

    thread = threading.Thread(target=target)        
    thread.start()
    thread.join(timeout)

    if thread.is_alive():
        me = os.getpid()
        print "Terminating Process"
        self.kill_proc_tree(me, including_parent=False)
        thread.join()

    print self.process.returncode

 command = Command(path_to_bat_file)
 command.run(timeout=500)

0 个答案:

没有答案