Как убедиться, что программа запущена и перезапустить ее при необходимости? - PullRequest
4 голосов
/ 24 апреля 2009

Я разработал программное обеспечение (на C ++), которое должно работать постоянно. Это в основном означает, что его нужно перезапускать каждый раз, когда он останавливается.

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

Заранее спасибо

Ответы [ 8 ]

9 голосов
/ 24 апреля 2009

Fedora и Ubuntu используют upstart , который может автоматически перезапускать вашего демона, если он выйдет.

6 голосов
/ 24 апреля 2009

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

#!/bin/sh
while true; do
  ./Your_program
done
4 голосов
/ 24 апреля 2009

Есть два способа сделать это на * nix:

  1. Использование инфраструктуры ОС (например, smf / svc в Solaris, upstart в Ubuntu и т. Д.) Это правильный способ, так как вы можете остановить / перезапустить / включить / отключить / перенастроить в любое время.

  2. Используйте "respawn" в / etc / inittab (включено во время загрузки).

4 голосов
/ 24 апреля 2009

Монит может делать то, что вы хотите и многое другое.

cron - это вариант, если ваше приложение будет достаточно умным, чтобы проверить его работоспособность (это позволит избежать запуска многих его копий). Обычно это делается стандартным способом через PID-файлы.

2 голосов
/ 24 апреля 2009

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

1 голос
/ 27 февраля 2010

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

Вот мой скрипт, использующий PrcView - бесплатную утилиту для просмотра процессов. И я использовал notepad.exe в качестве примера приложения, которое должно быть запущено, я не уверен, что команда для проверки каждые 10 минут и куда она будет идти в моем сценарии.

@ эхо выкл PATH =% PATH%;% ProgramFiles% \ PV,% ProgramFiles% \ Notepad PV.EXE notepad.exe> ​​nul если ERRORLEVEL 1 перейти к Process_NotFound : Process_Found эхо Блокнот работает Goto END : Process_NotFound эхо Блокнот не работает выключение / т / т 50 Goto END : END

1 голос
/ 24 апреля 2009

Создайте программу, которую вы хотите, чтобы она постоянно выполнялась как дочерний процесс «наблюдателя», который перезапускает его по завершении. Вы можете использовать wait / waitpid (или SIGCHILD), чтобы сказать, когда ребенок заканчивает. Я ожидал бы, что чей-то написанный код сделает это (это в значительной степени то, что делает init (8))

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

РЕДАКТИРОВАТЬ: Возможно, вы сможете получить init, чтобы сделать это за вас - дать ему тип «респауна» в inittab. Со страницы руководства:

respawn
    The process will be restarted whenever it terminates (e.g. getty). 
0 голосов
/ 24 апреля 2009

Это не так просто. Если вы думаете: «Я знаю, я напишу программу, которая будет следить за моей программой, или посмотрим, существует ли такая программа как стандартная служба!» тогда что если кто-то убьет эту программу? Кто смотрит на наблюдателя?

...