Я запускаю программу из скрипта python (в настоящее время с os.system
). Однако иногда программа зависает в какой-то момент, и я бы хотел ее убить, если ничего не было записано в stdout или stderr через определенный промежуток времени. Простой тайм-аут в программе не будет работать, потому что этот код обычно работает очень долго (от нескольких часов до нескольких дней), а иногда он зависает, прежде чем ему еще предстоит пройти долгий путь.Как убить подпроцесс, если никакой активности в stdout/stderr
Кажется, что subprocess.Popen
- это путь, но я не нашел хороший пример того, как это сделать. Я также хотел написать stdout/stderr в файл.
Основываясь на некоторых примерах, я думал о чем-то вроде этого:
p = Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None)
while True:
line = p.stdout.readline()
outfile.write(line)
# save current time or something, compare to time of
# previous loop, if larger than timeout, kill process
Но я не уверен, как реализовать петлю времени, и как убедиться в том, что while
не работает вечно, когда процесс в конечном итоге заканчивается сам по себе (и не вешает). Любые указатели будут высоко оценены.
Почему бы не исправить ошибку в дочернем процессе, так что не висит? –
@JohnZwinck, да, это, конечно, лучшее решение. Однако в этом случае это редкое явление и очень сложно воспроизвести. В некоторых случаях он также зависает по причинам вне процесса (например, файловая система и т. Д.). – tiago