在OS X中检测挂起的python shell

时间:2014-02-06 17:32:56

标签: python multithreading macos terminal stdout

我有一个程序可以实现一个错误的库,这个库偶尔会因为不正确地实现并行而挂起。

我没有时间来修复核心问题,所以我正在寻找一个黑客来弄清楚这个过程何时挂起并且没有完成它的工作。

是否有任何OS X或python特定的API来执行此操作?是否可以使用另一个线程甚至主线程来重复解析stdout,以便当最后几行在一定时间内没有改变时,另一个线程会被通知并且可以杀死行为错误的线程? (然后重启?

1 个答案:

答案 0 :(得分:1)

基本上您正在寻找监控过程。它将运行一个命令(或一组命令)并观察它们的执行,寻找特定的东西(在你的情况下,stdout上的沉默)。参考下面的2个SO问题(以及一些文档的简要介绍),您可以快速构建一个超级简单的监视器。

https://stackoverflow.com/questions/2804543/read-subprocess-stdout-line-by-line https://stackoverflow.com/questions/3471461/raw-input-and-timeout

# 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