openwrt 的开机自启的机制是:
创建 /etc/init.d/[service]
这个 service 本质是一个脚本,会重载/etc/rc.common
里的启停函数(应该可以这样理解)
脚本里面标注 START STOP 的值,会被认定为该服务的优先级。
然后就可以通过 service [service_name] start/stop
来启停服务
最后 service [service_name] enable
就会创建 /etc/rc.d/S50uhttpd --> /etc/init.d/uhttpd
的软链接
最后,该服务就会根据优先级进行开机启动
现在的问题是,写了了一个简单的服务,大致是:
#!/bin/sh /etc/rc.common
# Example script
# Copyright (C) 2007 OpenWrt.org
START=55
STOP=55
start() {
echo start
/usr/sbin/xxxx -a -b -c
}
stop() {
echo stop
/usr/bin/killall [service_name]
}
boot() {
echo boot
start
}
脚本也加了执行权限和 enable 了,也能看到软链接。但是就是无法开机启动。日志也无法排查,不知道是什么情况?
1
vinsec OP 是不是 17.01.5 版本的 op 只支持 procd 风格的 init 脚本
|
2
ysc3839 2019-03-04 22:43:06 +08:00 via Android
脚本里用 logger -t [service_name] [log_msg] 记录到系统日志,看看有没有成功启动。
|
3
vinsec OP @ysc3839 我是 SSH 进去看进程有没有启动的,不过脚本怎么改都没用。
我找出原因了。OP 新版本必须使用 procd 语法风格的脚本才能创建自启服务。 官网链接: https://openwrt.org/docs/guide-developer/procd-init-scripts |
4
ysc3839 2019-03-04 23:03:44 +08:00 via Android
@vinsec 我要你这么做的目的是确认脚本是否有执行,排除目标程序启动后退出的情况。
只支持 procd 是错误的,我目前使用的 18.06.1 中的 /etc/init.d/boot 就没有使用。 |
5
vinsec OP @ysc3839 我明天试一下再来回复。我没有看 boot,不过 init.d 下的其他服务基本都是 procd 写的,可能结论下早了。
|
6
paradislover 2019-03-05 09:27:18 +08:00 via Android
运行下 /etc/init.d/ucitrack
|