在OS X中检测挂起的python shell
我有一个程序,它实现了一个错误库,由于不正确地实现了并行,该库偶尔会挂起 我没有时间来解决核心问题,所以我正在寻找一种破解方法,以确定进程何时挂起,何时没有完成它的工作在OS X中检测挂起的python shell,python,multithreading,macos,terminal,stdout,Python,Multithreading,Macos,Terminal,Stdout,我有一个程序,它实现了一个错误库,由于不正确地实现了并行,该库偶尔会挂起 我没有时间来解决核心问题,所以我正在寻找一种破解方法,以确定进程何时挂起,何时没有完成它的工作 是否有任何特定于OSX或python的API来执行此操作?是否可以使用另一个线程或甚至主线程重复解析stdout,以便在某个持续时间内最后几行没有更改时,通知另一个线程并可以杀死行为异常的线程?(然后重新启动?基本上,您正在寻找一个监视进程。它将运行一个命令(或一组命令)并观察它们的执行情况,以寻找特定的东西(在您的情况下,在s
是否有任何特定于OSX或python的API来执行此操作?是否可以使用另一个线程或甚至主线程重复解析stdout,以便在某个持续时间内最后几行没有更改时,通知另一个线程并可以杀死行为异常的线程?(然后重新启动?基本上,您正在寻找一个监视进程。它将运行一个命令(或一组命令)并观察它们的执行情况,以寻找特定的东西(在您的情况下,在
stdout上保持沉默)
)。参考下面的两个问题(以及一些文档的简要介绍),您可以快速构建一个超级简单的监视器
# monitor.py
import subprocess
TIMEOUT = 10
while True:
# start a new process to monitor
# you could also run sys.argv[1:] for a more generic monitor
child = subprocess.Popen(['python','other.py','arg'], stdout=subprocess.PIPE)
while True:
rlist,_,_ = select([child.stdout], [], [], TIMEOUT)
if rlist:
child.stdout.read() # do you need to save the output?
else:
# timeout occurred, did the process finish?
if child.poll() is not None:
# child process completed (or was killed, but didn't hang), we are done
sys.exit()
else:
# otherwise, kill the child and start a new one
child.kill()
break