如何向erl -config指令传参实现sys.config配置文件动态化
Erlang启动时动态调整sys.config配置的实现方法
方法1:启动参数直接覆盖配置项(最简便)
这是Erlang原生支持的能力,参数优先级高于sys.config中的配置,无需修改配置文件即可动态调整:
- 语法规则:
-<应用名> <配置键> <配置值>,直接跟在原有启动命令后即可生效 - 示例:
假设你的sys.config内容如下:
[{kernel, [{logger_level, info}]}, {my_app, [{listen_port, 8080}, {run_mode, prod}]}].
你要在启动时把日志级别改成debug、监听端口改成9000,直接执行以下命令即可:erl -config sys.config -kernel logger_level debug -my_app listen_port 9000 [其他自定义Args]
启动后调用application:get_env(my_app, listen_port)就能拿到覆盖后的9000值。
注意:如果配置值是字符串类型,需要在外层加单引号、内层加双引号,比如修改host配置的命令为:
erl -config sys.config -my_app host '"192.168.1.2"',避免Erlang把值解析为原子。
方法2:脚本预生成临时配置文件(适合复杂批量调整)
如果需要一次修改大量配置、或者配置值有动态计算逻辑,可以用脚本先生成临时配置文件再启动Erlang:
- 实现步骤:
- 先制作
sys.config.template模板文件,把需要动态替换的部分用占位符标注,比如:
[{my_app, [{listen_port, {{CUSTOM_PORT}}}, {db_host, "{{DB_HOST}}"}]}].
- 写启动脚本(以shell脚本为例),接收传入的参数替换占位符后生成临时配置:
#!/bin/bash # 接收传入的端口、数据库地址参数 CUSTOM_PORT=$1 DB_HOST=$2 # 替换模板生成临时配置文件 sed -e "s/{{CUSTOM_PORT}}/$CUSTOM_PORT/g" -e "s/{{DB_HOST}}/$DB_HOST/g" sys.config.template > /tmp/sys_runtime.config # 启动Erlang,把剩余参数透传给erl命令 erl -config /tmp/sys_runtime.config "${@:3}" # 启动完成后可选删除临时配置 rm /tmp/sys_runtime.config
- 启动时直接传参即可:
./start.sh 9000 10.0.0.5 [其他Erl参数]
方法3:运行时动态修改配置
如果需要在Erlang运行过程中修改配置,可以直接调用OTP提供的接口:
- 临时修改(重启后失效):执行
application:set_env(MyApp, Key, NewValue)即可,改动会立即生效(具体生效逻辑要看应用有没有监听配置变更事件) - 持久化修改:可以自己实现配置写入逻辑,把修改后的配置全量写入
sys.config文件,下次启动就会加载新配置。
内容的提问来源于stack exchange,提问作者KJ_kaka
相关产品推荐
相关产品推荐

