说明
- OpenWRT 的启动脚本放在 /etc/init.d 目录下,并且须要 chmod +x 赋予执行权。
- OpenWRT 开机时会自动运行 /etc/rc.d 目录下的脚本。由 /etc/init.d 链接生成。
sh
chmod +x /etc/init.d/{name}
service {name} {action}
# 或
/etc/init.d/{name} {action}
编写
/etc/rc.common 中已经定义了所有默认的函数,只需要重写几个函数就可以实现启动脚本
基础脚本[1]
sh
#!/bin/sh /etc/rc.common
# 启动的顺序,越大越靠后
START=20
# 停止的顺序, 越小越靠前
STOP=15
start(){
echo "script is start"
}
stop(){
echo "script is stop"
}
reload() {
echo "script is reload"
}
restart(){
echo "script is restart"
}
# 系统启动时执行
# boot(){}
# 系统关机时执行
# shutdown(){}
# 增加自定义命令方法
EXTRA_COMMANDS="custom1 custom2 custom3"
EXTRA_HELP=<<EOF
custom1 Help for the custom1 command
custom2 Help for the custom2 command
custom3 Help for the custom3 command
EOF
custom1 () {
echo "script is custom1"
}
custom2 () {
echo "script is custom2"
}
custom3 () {
echo "script is custom3"
}
可覆盖方法以及说明
方法 | 说明 | /etc/rc.common 默认操作 |
---|---|---|
start | 启动服务 | return 0 |
stop | 停止服务 | return 0 |
restart | 重启服务 | stop && start |
reload | 重新加载配置文件,如果失败则重启 | restart |
enable | 启动开机自启动 | 创建 /etc/rc.d/{S${START}${name}, K${STOP}${name}} |
disable | 禁用开机自启动 | 删除 /etc/rc.d/{S${START}${name}, K${STOP}${name}} |
boot | 系统启动调用 boot | start |
shutdown | 系统关机 / 重启时调用 shutdown | stop |
depends | 依赖关系 (未找到详细使用方法) | return 0 |
默认导出的命令说明
命令 | 说明 | 命令 | 说明 |
---|---|---|---|
start | 启动服务 | stop | 停止服务 |
restart | 重启服务 | reload | 重载服务 |
enable | 启用自动启动 | disable | 禁用自动启动 |
enabled | 是否开启自动启动 | help | 输出命令帮助 |
boot | 系统调用 | shutdown | 系统调用 |
depends | 系统调用 |
procd 脚本[2]
继承基础脚本信息
由 /etc/rc.common 中导入的 /lib/functions/procd.sh 实现 procd 方法
覆盖方法说明
名称 | 说明 | /etc/rc.common 默认操作 |
---|---|---|
start_service | 启动服务 | return 0 |
service_started | 服务启动后 | undefined |
stop_service | 停止服务 | return 0 |
service_stopped | 服务停止后触发 | undefined |
reload_service | 重新加载配置文件 | start |
service_running | 检查服务是否正在运行 | procd_running |
status_service | 检查服务状态 | _procd_status |
service_triggers | 服务触发器配置 | return 0 |
service_data | return 0 |
导出命令
命令 | 说明 | 调用方法 |
---|---|---|
start | 启动服务 | start_service & service_started |
stop | 停止服务 | stop_service & procd_kill &service_stopped |
reload | 重载服务 | reload_service |
running | 检查服务是否在运行 | service_running |
status | 获取服务状态 | status_service |
trace | ||
info | 打印 procd 服务信息 | _procd_ubus_call |
procd 基础方法
方法 | 说明 |
---|---|
procd_open_instance([name]) | 新增服务实例 |
procd_set_param(type, [value...]) | 实例配置 |
procd_append_param(type, [value...]) | 追加实例配置 |
procd_close_instance | 完成服务实例新增 |
procd 触发器注册方法
方法 | 说明 |
---|---|
procd_open_trigger | 打开触发器配置 |
procd_add_reload_trigger([name...]) | 配置文件变化触发 reload |
procd_add_reload_interface_trigger(interface) | 接口变化触发 reload |
procd_add_reload_mount_trigger([path...]) | 挂载变化时触发 reload |
procd_add_restart_mount_trigger([path...]) | 挂载变化时触发 restart |
procd_close_trigger | 完成触发器配置 |
procd type 列表
type | 类型 | 说明 |
---|---|---|
command | kv-list | 命令行参数 |
env | kv-list | 环境变量 |
详细见 [3]
相关工具
一个系统自带的工具,配合基础脚本就可创建简单的守护进程
由 /etc/rc.common 中导入的 /lib/functions/service.sh 实现
sh
#!/bin/sh /etc/rc.common
SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1
START=20
STOP=15
start(){
service_start {path/to/name}
}
stop(){
service_stop {path/to/name}
}
可用方法
方法 | 说明 |
---|---|
service_start | 启动服务 |
service_stop | 停止服务 |
service_reload | 重新加载服务 |
service_check | 检测服务 |
service_signal | 发送 $SERVICE_SIG 信号 |
配置变量
名称 | 说明 | 默认值 | 启用值 | 拼接选项 |
---|---|---|---|---|
SERVICE_DEBUG | DEBUG 只打印命令不运行 | undefined | 1 | echo |
SERVICE_DAEMONIZE | 后台运行 | undefined | 1 | -b |
SERVICE_WRITE_PID | 创建 PID 文件 进行匹配 | undefined | 1 | -m |
SERVICE_MATCH_EXEC | 使用 EXEC 命令行进行匹配 | 1 | 1 | -x $exec |
SERVICE_MATCH_NAME | 使用 EXEC 进程名称进行匹配 | undefined | 1 | -n $SERVICE_NAME |
SERVICE_USE_PID | undefined | 1 | ||
SERVICE_NAME | 进程名称 | 执行文件的名称 | ||
SERVICE_PID_FILE | PID 文件 | /var/run/$SERVICE_NAME.pid | -p $PID_FILE | |
SERVICE_SIG | 停止、杀死、重载信号 | undefined | -s $SERVICE_SIG | |
SERVICE_SIG_RELOAD | 重载时发送的信号 | HUP | 覆盖 $SERVICE_SIG | |
SERVICE_SIG_STOP | 停止时发送的信号 | TERM | 覆盖 $SERVICE_SIG | |
SERVICE_STOP_TIME | 停止超时,超时杀死进程 | 5 | ||
SERVICE_UID | 运行使用的 UID | undefined | -c $SERVICE_UID | |
SERVICE_GID | 运行使用的 GID | undefined | :$SERVICE_GID | |
SERVICE_QUIET | 静默执行 | 1 | 1 | -q |