Не знаю какого-либо общего способа узнать, висит ли процесс или работает ли он. Если процесс зависает из-за проблемы с блокировкой, тогда он может потреблять 0% CPU, и вы можете угадать, что он висел и не работает; но если он зависает с бесконечным циклом, процесс может сделать CPU на 100% занятым, но не выполнить какую-либо полезную работу. И у вас может быть процесс общения в сети, разговаривающий с очень медленным хостом с длинными таймаутами; который не будет висели, но будет потреблять 0% процессора во время ожидания.
Я думаю, что, в общем, единственная надежда, что у вас есть, - создать какую-то систему «сторожевого пса», где ваш подпроцесс использует межпроцессное общение для периодической отправки сигнала, который означает «Я все еще в живых".
Если вы не можете изменить программу, которую используете в качестве подпроцесса, то, по крайней мере, попытайтесь найти , почему это зависает, и посмотрите, можете ли вы затем выяснить способ догадываться, что он повесил , Возможно, в нем обычно есть сбалансированное сочетание процессора и ввода-вывода, но когда он зависает, он работает в замкнутом бесконечном цикле, а использование процессора идет на 100%; это будет вашей подсказкой, что пришло время убить его и перезапустить. Или, может быть, он записывает в файл журнала каждые 30 секунд, и вы можете контролировать размер файла и перезапускать его, если файл не растет. Или, может быть, вы можете поместить программу в «подробный» режим, когда он печатает сообщения, когда он работает (либо с stdout
, либо с stderr
), и вы можете посмотреть их. Или, если программа работает как демон, возможно, вы можете активно ее запросить и посмотреть, жива ли она; например, если это база данных, отправьте простой запрос и посмотрите, удастся ли ему это сделать.
Поэтому я не могу дать вам общий ответ, но у меня есть надежда, что вы сможете найти способ обнаружить, когда зависает ваша конкретная программа.
Наконец, наилучшим возможным решением было бы выяснить, почему он висит, и исправить проблему, чтобы этого больше не случилось. Это может быть невозможно, но, по крайней мере, помнить об этом. Вам не нужно обнаруживать, что программа висит, если программа никогда не висит больше!
P.S. Я предлагаю вам выполнить поиск в Google для «как контролировать процесс» и посмотреть, есть ли у вас какие-либо полезные идеи.