OpenWRT开机后无法自动执行/etc/init.d下自定义shell脚本如何解决
OpenWRT 开机自动执行自定义init.d脚本故障解决方案
- 修正脚本命名规则
OpenWRT/etc/init.d/目录下的服务脚本默认不需要带.sh后缀,建议将当前脚本重命名后重新注册服务:
mv /etc/init.d/customchain.sh /etc/init.d/customchain chmod +x /etc/init.d/customchain /etc/init.d/customchain disable /etc/init.d/customchain enable
- 调整启动逻辑避免规则被覆盖
默认OpenWRT防火墙服务会在开机过程中重载规则,可将脚本中的START值调整为99以上,或在start函数开头添加等待逻辑,避免规则被后续启动的防火墙服务覆盖:
start(){ # 等待网络和防火墙初始化完成 sleep 15 # 此处替换为你的自定义iptables规则,建议写命令绝对路径 /usr/sbin/iptables [你的规则参数] }
若你使用的是22.03及以上版本的OpenWRT,系统默认使用fw4+nftables框架,iptables为兼容层,建议确认iptables-nft包已安装,或直接使用nftables命令编写规则。
- 添加日志排查执行状态
在start函数开头添加日志输出,方便定位故障:
logger "customchain service is running"
重启后执行logread | grep customchain查看日志:
- 无对应日志:排查软链接权限、脚本shebang行是否正确,确认
/etc/rc.d/S99customchain软链接指向正常 - 有对应日志但规则未生效:确认脚本内命令无bash专属语法,所有命令使用绝对路径,排查是否有其他开机服务重载了iptables规则
- 备选方案:使用rc.local兜底
若上述方案都不生效,可直接将脚本执行命令写入/etc/rc.local文件的exit 0行之前:
/etc/init.d/customchain start
/etc/rc.local为OpenWRT开机最后执行的脚本,可保证你的规则在所有系统服务初始化完成后加载。
内容的提问来源于stack exchange,提问作者Popsicle
相关产品推荐
相关产品推荐

