问题
今天在研究OpenWRT的保活进程procd
, 了解到如果要重新拉起进程, 可以通过设置触发函数来调用service_reload()
实现服务重启;
service_triggers()
{
procd_add_reload_trigger "<uci-file-name>" "<second-uci-file>"
procd_add_reload_interface_trigger <interface>
}
但是设置了触发修改的uci配置文件, commit之后发现并没有重新启动服务, 于是感觉到很奇怪.
结果
查了一下发现需要再调用reload_config
之后才会触发事件, commit
之后不会触发的;
When using uci from command line uci commit doesn’t generate config.change event. It requires calling reload_config afterwards.
This does not apply to using uci over rpcd plugin.
但是当我调用reload_config
时, 发现指令报错, 就很奇怪;
uci: Parse error (invalid command) at line 0, byte 0
uci: Parse error (invalid command) at line 1, byte 0
调查了一下发现是/etc/config
文件夹下存在了一些非UCI的配置文件, 因此导致reload时解析报错; 可以使用一下代码定位文件:
for CONF in /etc/config/* ; do uci show "${CONF##*/}" > /dev/null || echo "${CONF}"; done
原理很简单, 遍历使用uci show 显示每个文件, 如果显示成功短路与后面的就不执行, 如果显示失败即文件uci不可读, 则执行后面的显示文件名.
执行reload_config
确实触发了服务重启, 这样子触发和服务内部自己重置服务还存在部分差异, 配置参数修改触发重新拉起应用, 可以简化服务代码, 不用做重置状态的服务, 但如果保存的参数不需要重置服务这种触发则显得有些多于.