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
在 Lua 脚本中使用 UCI (Unified Configuration Interface) 操作 OpenWrt 系统配置文件时,`uci:delete()` 方法用于从配置文件中删除特定的选项、节(section) 或者条目(entry)。以下是关于如何使用 `uci:delete()` 的详细介绍。 ### 使用 `uci:delete()` #### 语法结构 ```lua uci:delete(config_name, [section], [option]) ``` - **config_name**: 配置文件名(不带 `.conf` 扩展),例如 `"network"` 表示 `/etc/config/network` - **[section]**: 可选参数 - 要删除的具体节名称或匿名节数字索引;如果省略此参数则表示整个配置文件都将被清除。 - **[option]**: 可选参数 - 若指定了 section 参数,则 option 表示要删除的该节内的某个键值对;若未提供此项而只提供了 section,则会删除整个节。 > 注意:每次调用 `uci:delete()` 后应紧跟一次 `uci:commit()` 来保存更改至磁盘上生效。 #### 示例代码 ##### 删除一个选项 如果你想删除位于 network 配置文件下 lan 节点里的 ipaddr 键及其对应的值: ```lua local uci = require("lucimodel.uci").cursor() uci:delete("network", "lan", "ipaddr") uci:commit("network") print("已成功删除 'network.@lan.ipaddr'") ``` ##### 删除一整节 假如你想完全移除名为 wlan0 的无线网络设置节点: ```lua local uci = require("lucimodel.uci").cursor() uci:delete("wireless", "wlan0") uci:commit("wireless") print("已成功删除 'wireless.wlan0' 整个节") ``` ##### 清空某一配置文件的所有内容 当你想一次性清空整个 dhcp 配置文件而不保留任何信息: ```lua local uci = require("lucimodel.uci").cursor() uci:foreach("dhcp", function(s) uci:delete("dhcp", s[".name"]) end) -- 最后提交更改 uci:commit("dhcp") print("已成功清空 'dhcp' 配置文件内所有内容") ``` 请注意,在实际应用环境中操作之前一定要确认好你要修改的是哪一个配置项,并做好备份工作以防误删重要资料! 此外,确保你有足够的权限去读取和编辑这些系统级别的配置文件,通常需要 root 用户身份才能完成此类任务。 如果您有任何疑问或者其他有关Lua编程或是OpenWrt系统的困惑都可以随时告诉我哦~ --
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值