Я недавно столкнулся с ошибкой, где все приложение Erlang умерло, приведя к сообщению журнала, которое было похоже на это:
=INFO REPORT==== 11-Jun-2010::11:07:25 ===
application: myapp
exited: shutdown
type: temporary
Я понятия не имею, что инициировало это завершение работы, но настоящая проблема, которую я имею, состоит в том, что оно не перезапускало себя. Вместо этого теперь пустой Erlang VM просто расположился, там ничего не делая.
Теперь, от исследования я сделал, похоже, что существует другой, "запускают типы", можно дать приложение: 'переходный' и 'постоянный'.
Если я запускаю Супервизор в рамках приложения, я могу сказать этому делать конкретный процесс переходным или постоянным, и это автоматически перезапустит его для меня. Однако согласно документации, если я подаю заявку, переходную или постоянную, она не перезапускает его, когда она умирает, а скорее она уничтожает все другие приложения также.
То, что я действительно хочу сделать, так или иначе говорят Erlang VM, что конкретное приложение должно всегда работать, и если это понижается, перезапустите его. Действительно ли это возможно сделать?
(Я не говорю о реализации супервизора сверху моего приложения, потому что затем это - выгода 22: что, если мой процесс супервизора отказывает? Я ищу своего рода API или устанавливаю это, я могу использовать, чтобы сделать, чтобы Erlang контролировал и перезапустил мое приложение для меня.)
Спасибо!
Вы должны быть в состоянии исправить это в супервизоре верхнего уровня: установите стратегию перезапуска, чтобы разрешить миллион перезапусков каждую секунду, и приложение никогда не должно падать. Что-то вроде:
init(_Args) -> {ok, {{one_for_one, 1000000, 1}, [{ch3, {ch3, start_link, []}, permanent, brutal_kill, worker, [ch3]}]}}.
(Пример адаптирован из OTP Design Principles User Guide)
.Используйте Monit, затем настройте приложение на завершение работы с помощью супервизора для всего приложения с разумной частотой перезапуска. Если приложение завершается, виртуальная машина завершает работу, и monit все перезапускает.
Мне никогда не удавалось заставить Heart быть достаточно надежным, поскольку он перезапускает виртуальную машину только один раз и не справляется с kill -9 виртуальной машины erlang.
Вы можете использовать heart для перезапуска всей ВМ, если она выйдет из строя, а затем использовать постоянный тип приложения, чтобы убедиться, что ВМ выходит, когда выходит ваше приложение.
В конечном итоге вам нужно что-то над вашим приложением, чему вы должны доверять, будь то процесс супервизора, виртуальная машина erlang или написанный вами сценарий оболочки - всегда будет проблемой, если он тоже выйдет из строя.