uci: Parse error (invalid command) at line 0, byte 0

问题

今天在研究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确实触发了服务重启, 这样子触发和服务内部自己重置服务还存在部分差异, 配置参数修改触发重新拉起应用, 可以简化服务代码, 不用做重置状态的服务, 但如果保存的参数不需要重置服务这种触发则显得有些多于.

参考

  1. procd init script parameters
  2. Issue with installing several packages
  • 0
    点赞
  • 3
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值