说明

  1. OpenWRT 的启动脚本放在 /etc/init.d 目录下,并且须要 chmod +x 赋予执行权。
  2. 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系统启动调用 bootstart
shutdown系统关机 / 重启时调用 shutdownstop
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_datareturn 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类型说明
commandkv-list命令行参数
envkv-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_DEBUGDEBUG 只打印命令不运行undefined1echo
SERVICE_DAEMONIZE后台运行undefined1-b
SERVICE_WRITE_PID创建 PID 文件 进行匹配undefined1-m
SERVICE_MATCH_EXEC使用 EXEC 命令行进行匹配11-x $exec
SERVICE_MATCH_NAME使用 EXEC 进程名称进行匹配undefined1-n $SERVICE_NAME
SERVICE_USE_PIDundefined1
SERVICE_NAME进程名称执行文件的名称
SERVICE_PID_FILEPID 文件/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运行使用的 UIDundefined-c $SERVICE_UID
SERVICE_GID运行使用的 GIDundefined:$SERVICE_GID
SERVICE_QUIET静默执行11-q

参考


  1. initscripts ↩︎

  2. procd-init-scripts ↩︎

  3. procd-init-scripts#service_parameters ↩︎