2014-02-06 3 views
1

У меня есть программа, которая реализует библиотеку с ошибками, которая иногда зависает из-за неправильной реализации парализации.Обнаружить висящую оболочку python в OS X

У меня нет времени, чтобы исправить основную проблему, поэтому я ищу хак, чтобы понять, когда процесс висит, а не выполняет свою работу.

Есть ли какие-либо OS X или специфичные для python API для этого? Можно ли использовать другой поток или даже основной поток для повторного анализа stdout, так что, когда последние несколько строк не изменились в течение определенной продолжительности, другой поток уведомляется и может убить неверную нить? (а затем перезагрузите?

ответ

1

В основном вы ищете мониторный процесс. Он будет запускать команду (или набор команд) и наблюдать за их исполнением в поисках конкретных вещей (в вашем случае, тишина на stdout). 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 
Смежные вопросы