升级ejabberd至19.09.1后mod_lhcping模块启动失败求助
解决ejabberd 19.09.1升级后mod_lhcping启动失败的问题
别担心,这个问题其实是ejabberd版本升级后API变动导致的自定义模块兼容性问题,我来帮你一步步解决。
首先看你的错误日志,核心问题是**gen_mod:get_opt/4函数在ejabberd 19.09.1中已经不存在了**,而你使用的mod_lhcping模块还是基于ejabberd 18.04的旧API编写的,所以启动时触发了未定义函数的崩溃。
问题根源
ejabberd从18.x升级到19.x时,对核心模块gen_mod的API做了调整:旧版本的gen_mod:get_opt/4(四参数调用)被移除或重构,新版本改用gen_mod:get_option/3或者直接使用Erlang原生的maps:get/3来读取配置参数(因为ejabberd 19.x的配置已经转为map结构)。
具体修复步骤
定位并修改模块代码
打开mod_lhcping.erl文件,找到日志里提到的第120行,原来的代码大概是这样的:gen_mod:get_opt(send_pings, Opts, #Fun<mod_lhcping.0.4469384>, false)把它替换成以下两种方式之一:
- 方式一(直接用map操作,更简洁):
maps:get(send_pings, Opts, false) - 方式二(使用ejabberd新版标准API):
gen_mod:get_option(send_pings, Opts, false)
注意:如果你的模块里还有其他
gen_mod:get_opt的调用,都需要做同样的替换。- 方式一(直接用map操作,更简洁):
重新编译模块
在命令行中用Erlang编译器重新编译修改后的模块:erlc mod_lhcping.erl替换模块并重启ejabberd
- 把编译好的
mod_lhcping.beam文件替换到ejabberd的模块目录中(通常是/usr/lib/ejabberd/ebin/或者你自定义的模块路径) - 重启ejabberd服务:
systemctl restart ejabberd
- 把编译好的
额外提示
如果后续还有其他模块启动失败的问题,大概率也是类似的API变动导致的,你可以对照ejabberd 19.x的官方文档,检查旧模块中使用的API是否已经被调整。
内容的提问来源于stack exchange,提问作者AnimeshKashyap
相关产品推荐
相关产品推荐

