执行“离线”erlang OTP版本升级

时间:2011-11-07 18:15:00

标签: erlang otp

我正在开发一个大量处理OTP版本及其升级过程的项目。 我设法使用release_handler函数unpack_release,install_release和make_permanent从发布升级存档(tar.gz)执行热升级。它们都在正在升级的节点中调用。

现在我必须处理erlang节点关闭的情况,我必须进行“离线”升级。基本上我想要实现的是解压缩发布,并更新某些文件,如RELEASES和start_erl.data(可能还有更多?),因此它们处于热升级后的状态。结果是,当节点启动时,将启动新安装的erlang版本。另外,重要的是我想避免运行旧版本。

任何想法如何尽可能简单干净地做到这一点?

1 个答案:

答案 0 :(得分:1)

启动erlang节点以获取shell。不需要节点名称,只需确保运行与目标节点相同的~/bin/erl。然后将您的发布包放在~/lib/erlang/releases中并按正常方式解压缩:

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

现在退出,关闭shell:

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}].

再次启动shell并使其永久化:

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中的启动脚本。