我正在开发一个大量处理OTP版本及其升级过程的项目。 我设法使用release_handler函数unpack_release,install_release和make_permanent从发布升级存档(tar.gz)执行热升级。它们都在正在升级的节点中调用。
现在我必须处理erlang节点关闭的情况,我必须进行“离线”升级。基本上我想要实现的是解压缩发布,并更新某些文件,如RELEASES和start_erl.data(可能还有更多?),因此它们处于热升级后的状态。结果是,当节点启动时,将启动新安装的erlang版本。另外,重要的是我想避免运行旧版本。
任何想法如何尽可能简单干净地做到这一点?
答案 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
中的启动脚本。