openwrt添加守护进程

开始

以podsync为例:

———————————————podsync———————————————

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

#使用procd启动
USE_PROCD=1

#执行的顺序,按照字符串顺序排序并不是数字排序
START=95
STOP=01
SERVICE=podsync
PROC="/mnt/nvme0n1p3/podsync/podsync --config /mnt/nvme0n1p3/podsync/config.toml"

start_service() {
    echo "podsync start..."

    #创建一个实例, 在procd看来一个应用程序可以多个实例
    procd_open_instance

   #执行想要执行的命令或脚本
    procd_set_param command $PROC

   #进程意外退出的重启机制及策略
    procd_set_param respawn
    
    #关闭实例
    procd_close_instance
}

stop_service() {
        local pid=""
        pid=`ps -ef | grep podsync | grep "config.toml" | grep -v grep| awk '{print $1}'`
        if [ "${pid}" != "" ];then
                kill -9 ${pid}
        fi
}

restart() {
    stop
    start
}

———————————————podsync———————————————

该脚本放置在/etc/init.d/目录中。

必须指出来的是,被procd执行的程序不能是daemon后台程序,也不能使用nohup执行脚本,因为后台程序的主进程退出后在procd看来就是程序退出了,然后会进入respawn流程,之后重复启动和退出。

函 数 含 义

  • start_service 向 procd 注册并启动服务,是将在 services 所管理对象里面增加了一项
  • stop_service 让 procd 解除注册,并关闭服务, 是将在 services 中的管理对象删除
  • service_triggers 配置文件或网络接口改变之后触发服务重新读取配置
  • service_running 查询服务的状态
  • reload_service 重启服务,如果定义了该函数,在 reload 时将调用该函数,否则再次调用 start 函数
  • service_started 用于判断进程是否启动成功
#加入开机启动
service podsync enable

#检验是否开机启动成功
ls -la /etc/rc.d/po*

#关闭开机启动
service podsync disable  

#启动命令
service podsync start