Автоматический перезапуск приложений Erlang - PullRequest
5 голосов
/ 16 июня 2010

Недавно я столкнулся с ошибкой, из-за которой умерло все приложение Erlang, в результате чего появилось сообщение журнала, которое выглядело так:

=INFO REPORT==== 11-Jun-2010::11:07:25 ===
     application: myapp
     exited: shutdown
     type: temporary

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

Теперь, исходя из проведенного мною исследования, похоже, что есть и другие «типы запуска», которые вы можете подать в приложение: «переходный» и «постоянный».

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

Что я действительно хочу сделать, так это как-то сказать виртуальной машине Erlang, что конкретное приложение должно всегда работать, и если оно выходит из строя, перезапустить его. Можно ли это сделать?

(Я не говорю о реализации супервизора поверх моего приложения, потому что тогда уловка 22: что делать, если мой процесс супервизора падает? Я ищу какой-то API или параметр, который я могу использовать, чтобы иметь Erlang монитор и перезапустите мое приложение для меня.)

Спасибо!

Ответы [ 3 ]

5 голосов
/ 16 июня 2010

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

4 голосов
/ 17 июня 2010

Используйте Monit, затем настройте приложение для завершения с помощью супервизора для всего приложения с разумной частотой перезапуска.Если приложение завершается, VM прекращает работу, и monit перезапускает все.

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

4 голосов
/ 16 июня 2010

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

init(_Args) ->
    {ok, {{one_for_one, 1000000, 1},
          [{ch3, {ch3, start_link, []},
            permanent, brutal_kill, worker, [ch3]}]}}.

(Пример адаптирован из Руководство пользователя Принципов разработки OTP .)

...