как защитить мой процесс от гибели? - PullRequest
6 голосов
/ 30 июня 2011

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

Итак, мы планируем написать другую программу, скажем, программу B. Мы хотим, чтобы программа B и программа сервера защищали друг друга. Если программа нашего сервера завершится, программа B перезапустит ее. Если программа B завершается, серверная программа запустит его снова. Но у нас нет хорошего механизма, который позволял бы программе B и серверной программе получать уведомления при выходе из однорангового узла.

Ответы [ 4 ]

10 голосов
/ 30 июня 2011

Вы можете использовать init для присмотра за процессом, и, поскольку init завершается только при перезагрузке, вам не нужна «программа B».

Добавить в конец / etc / inittab:

x:3:respawn:/path/to/my/program

Информацию о синтаксисе и других опциях можно найти в man inittab

6 голосов
/ 30 июня 2011

Вы можете перезапустить свой сервер изнутри себя , используя fork. О, красота Unix.

Что-то вроде:

int result = fork();

if(result == 0)
    DoServer();

if(result < 0)
{
    perror(); exit(1);
}

for(;;)
{
    int status = 0;
    waitpid(-1, &status, 0);
    if(!WIFEXITED(status))
    {
        result = fork();
        if(result == 0)
            DoServer();
        if(result < 0)
        {
            puts("uh... crashed and cannot restart");
            exit(1);
        }
    }
    else exit(0);
}

EDIT:
Вероятно, разумно использовать макрос WIFEXITED в качестве условия проверки, который является более кратким и переносимым (соответственно изменил код). Кроме того, он адекватно моделирует семантику, которую мы, вероятно, хотим.

waitpid, учитывая нулевые флаги, не вернет ничего, кроме нормального или ненормального завершения. WIFEXITED приводит к true, если процесс завершился нормально, например, путем возврата из main или вызова exit. Если процесс завершился нормально (например, потому что вы запросили это), очень вероятно, что не захочет продолжать его перезапуск до конца дней!

4 голосов
/ 30 июня 2011

Разве система типа http://supervisord.org/ не будет для вас уязвимой?У нас есть супервизор, который контролирует несколько процессов, и я могу засвидетельствовать его особенности.очень хорошо, если это будет работать для вашего приложения.

2 голосов
/ 30 июня 2011

Обычно им приходится опрашивать друг друга.Пусть они посылают друг другу нулевой сигнал (который просто проверяет живучесть и не прерывает другую программу).

echo $$>$1
read otherpid < $2
while :; do
 while kill -0 $otherpid
  do
   sleep 1
  done
 # restart other program
 # (really restarting myself in my peer configuration)
 $0 $2 $1 &
 newpid=0
 while [ "$newpid" -eq "$otherpid" ]
  do
   sleep 2
   read newpid < $2
  done
 otherpid=$newpid
done

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

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