Выполнение обновления "erlang OTP" в автономном режиме - PullRequest
2 голосов
/ 07 ноября 2011

Я работаю над проектом, который тесно связан с выпусками OTP и процессом их обновления.Мне удалось выполнить горячие обновления из архива обновления релиза (tar.gz), используя функции release_handler unpack_release, install_release и make_permanent.Все они вызываются в самом обновляемом узле.

Теперь мне нужно разобраться с ситуацией, когда узел erlang не работает, и я должен выполнить «автономное» обновление.По сути, я хочу добиться распаковки релиза и обновления некоторых файлов, таких как RELEASES и start_erl.data (может быть, еще немного?), Чтобы они были в том же состоянии, в каком они были бы после горячего обновления.В результате при запуске узла загружается только что установленная версия erlang.Кроме того, важно то, что я хочу избежать запуска старого релиза.

Есть идеи, как сделать это настолько просто и аккуратно, насколько это возможно?

1 Ответ

1 голос
/ 22 июля 2012

Запустите узел erlang, чтобы получить оболочку.Не нужно указывать имя узла, просто убедитесь, что вы используете тот же ~/bin/erl, что и целевой узел.Затем поместите ваш релиз-пакет в ~/lib/erlang/releases и распакуйте его, как обычно:

1> application:start(sasl),
1> release_handler:unpack_release("my_release-1.0").
{ok, "1.0"}.

Теперь закройте оболочку:

2> q().

[Не пытайтесь обманутьиспользуя другое окно здесь!Вы должны выйти.]

Теперь вам нужно отредактировать файл ~/lib/erlang/releases/RELEASES и изменить статус нового выпуска с unpacked на current:

[{release,"My Release Package","1.0","5.9.1",
       [{kernel,"2.15.1","/Users/otpuser/lib/erlang/lib/kernel-2.15.1"},
        {stdlib,"1.18.1","/Users/otpuser/lib/erlang/lib/stdlib-1.18.1"},
        {sasl,"2.2.1","/Users/otpuser/lib/erlang/lib/sasl-2.2.1"}, ...],
-     unpacked}].
+     current}].

Запустить оболочкуснова и сделайте его постоянным:

1> application:start(sasl),
1> release_handler:make_permanent("1.0").
ok

[Примечание: все, что делает make_permanent/1, это помещает версию выпуска ("1.0") в ~/lib/erlang/releases/start_erl.data, чтобы вы могли обмануть здесь.]

Обязательно поместите конфигурацию вашей системы в ~/lib/erlang/releases/1.0/sys.config.

Теперь, когда вы запустите ~/bin/start, название выпуска будет считано с start_erl.data, а init будет использовать загрузочный скрипт в ~/lib/erlang/releases/1.0/start.boot.

...