Openwrt 路由设置(四):启动脚本
自定义启动脚本,可以启动自安装的各类应用。

Openwrt 路由设置(四):启动脚本

一、OpenWRT 启动脚本说明

OpenWRT的启动脚本放在 /etc/init.d 目录下,新建的脚本放在这里,并须要 chmod +x 赋予执行权。
OpenWRT开机时会自动运行 /etc/rc.d 目录下的脚本。注意不运行 /etc/init.d 里的。

/etc/rc.d 目录下有 /etc/init.d 目录下脚本的链接文件。

执行:

$ /etc/init.d/nnaammee enable 
# 或者
$ service nnaammee enable

当以 enable 参数调用启动脚本时,系统会创建一个该脚本文件的链接(例如S95nnaammee、K10nnaammee),放在 /etc/rc.d/ 目录下。
相当于运行了
$ ln -s /etc/init.d/nnaammee /etc/rc.d/S95nnaammee
$ ln -s /etc/init.d/nnaammee /etc/rc.d/K10nnaammee

此外,当以 disable 参数调用脚本时,系统会删除该两个软链接。

软链接文件名是在脚本名前添加S95,数字代表启动前后,越小越靠前启动。相同时按照名字字母顺序。

开机的时候会按照数字从小到大执行S开头的脚本来启动对应的程序;
关机的时候会按照数字从小到大执行K开头的脚本来关闭对应的程序。
数字范围是1-99。

二、基础模板

#!/bin/sh /etc/rc.common
# "new(er)" style init script
# include the common ‘run commands’ file /etc/rc.common needed for a service. 
# Look at /lib/functions/service.sh on a running system for explanations of what other SERVICE_
# options you can use, and when you might want them.
# openwrt支持旧的init scripts和新的procd scripts。USE_PROCD=1 此flag声明使用procd scripts。不建议设置。

START=95
STOP=10

APP=abc
SERVICE_WRITE_PID=1  # create a pid-file and use it for matching
SERVICE_USE_PID=1    # create its own pid-file and use it for matching
SERVICE_DAEMONIZE=1  # run in the background

# 必须有 start() 和 stop() 
start() {
    service_start /usr/bin/$APP
}
 
stop() {
    service_stop /usr/bin/$APP
}

boot() {
  echo "Hello world"
  # 先执行自己的启动工作
  # 略
  start "$@"  # 最后执行此命令,完成rc.common里预设的启动命令
}
shutdown() {
  # The service is finished, so turn off the hardware
  stop  # 最先执行此命令,完成rc.common里预设的关闭命令
  # 再执行自己的结束工作
  # 略
}

EXTRA_COMMANDS="custom"       # 可以添加自定义的commands
EXTRA_HELP="  custom  Help "  # 当用“脚本 + 此参数”运行时,显示此HELP内容。
custom() {
  echo "custom command"
  # do your custom job
}
  • start() 启动服务
  • stop() 停止服务
  • restart() 重启服务
  • reload() 重新加载配置文件,如果失败则重启
  • enable() 启动开机自启动
  • disable() 禁用开机自启动
  • boot() 有boot()时,系统启动调用boot()而不调用start()。
  • shutdown()有shutdown()时,系统关机/重启时调用shutdown()而不调用stop()。

因为在 /etc/rc.common 中已经定义了所有默认的函数,当我们没有重新实现这些函数时,程序会执行 /etc/rc.common 中的默认函数。假设没有自定义 restart 函数,程序将按照 /etc/rc.common 中的 restart 函数首先调用 stop 函数,再调用 start 函数。而一旦我们重新实现了这些函数,在执行时,程序就会调用我们自己实现的函数。

三、简单例子

#!/bin/sh /etc/rc.common

START=95
STOP=10

SERVICE_WRITE_PID=1
SERVICE_USE_PID=1
SERVICE_DAEMONIZE=1

start() {
  service_start  /usr/bin/caddy run -config /etc/caddy/Caddyfile
}
stop() {
  service_stop /usr/bin/caddy
}

附:另自动启动方法

$ nohup appname -flag ... >/dev/null 2>&1 &    # 手动启动,在后台运行。
$ ps | grep appname           # 查看进程
$ kill -15 $(pidof appname)   # 停止运行(SIGTERM)
或者
$ kill -9 $(pidof appname)    # 强制停止运行(SIGKILL)

开机自动启动:在 /etc/rc.local 文件的 exit 0 之前,添加上述启动命令。


最后修改于 2024-02-24