我有一个运行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)