linux - проверить, не умерла ли программа - PullRequest
0 голосов
/ 07 июня 2010

Я написал программу, которая должна постоянно работать. но так как я плохой программист, он очень часто вылетает. Есть ли способ, чтобы другая программа наблюдала и перезапускала его, когда он падает?

Ответы [ 6 ]

2 голосов
/ 07 июня 2010

Не будь благоразумным, но если ты плохой программист, что сказать, что твое наблюдение за программированием тоже не подведет;) И ты должен поправиться, чтобы у тебя не было этой проблемы (по этой причине),Тем не менее, вам, вероятно, понадобится следующий ответ:

Однако, если выздоровление невозможно, просто регулярно выполняйте задание cron, ища имя вашей программы в выходных данных 'пс.И этот ответ вы можете получить от superuser.com

1 голос
/ 07 июня 2010

Вы можете использовать supervisord

http://supervisord.org/

1 голос
/ 07 июня 2010

Нет необходимости в сторонних программах

Все это можно выполнить с помощью linux inittab

Страницы MAN inittab

Ищите "респаун"

0 голосов
/ 08 июня 2010

Я использую Monit для наблюдения за моими программами и услугами.

0 голосов
/ 08 июня 2010

Он по-прежнему не будет работать непрерывно, если у вас есть другая задача, отслеживающая его ... у него все еще будет короткое время простоя, пока он перезапускается.

Кроме того, если вы действуете как сетевой (или локальный) серверный процесс, вы потеряете любое состояние о выполняющихся запросах; Я надеюсь, что это нормально (конечно, ваши клиенты могут иметь встроенный тайм-аут и повторить попытку).

Наконец, если ваш процесс завершился сбоем, когда он находился в процессе хранения каких-либо постоянных данных, я надеюсь, что у него есть механизм работы с наполовину записанными файлами и т. Д.

Однако, если вы хотите, чтобы он был надежным, все эти вещи должны быть в любом случае верны, поэтому вы можете безопасно использовать что-то вроде супервизора.

0 голосов
/ 07 июня 2010

Поскольку Stackoverflow - это сайт программирования, позвольте мне дать вам общее представление о том, как будет реализован такой наблюдатель.

Первое, что нужно знать, это то, что ваш наблюдатель должен будет запустить наблюдаемую программу самостоятельно. Вы делаете это с fork и exec.

Что вы можете сделать, это дождаться завершения программы. Вы можете использовать системные вызовы ожидания (т.е. wait, waitpid или wait4) в зависимости от ваших конкретных потребностей. Вы также можете поймать SIGCHLD, чтобы получить асинхронную информацию о выходе вашего ребенка (вам нужно будет позвонить wait, чтобы узнать его статус).

Теперь, когда у вас есть статус, вы можете сказать, что процесс остановился из-за сигнала с макросом WIFSIGNALED. Если этот макрос возвращает true, значит, ваша программа завершилась сбоем и ее необходимо перезапустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...