Автоматически перезапустить приложения Erlang

StackOverflow https://stackoverflow.com/questions/3054640

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

Спасибо!

Это было полезно?

Решение

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

init (_ARGS) -> {OK, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, постоянный, brutal_kill, рабочий, [ch3]}]}}.

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

Другие советы

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

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

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

Я никогда не смог бы получить сердце, чтобы быть достаточно надежным, так как он только перезапускает виртуальную машину один раз, и оно не совпадает с убийством -9 из Эрланга ВМ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top