openwrt procd init脚本用法总结

一. 前言

        在openwrt系统中,procd init脚本用于控制服务进程的,控制主要表现在两个方面:定义服务进程的配置(例如服务进程的命令和带什么参数启动);确定什么情况下重新启动服务。定义服务进程的配置由start_service()函数处理,在里面指定服务进程的命令和它需要带的参数,这些都由procd进程管理。

        procd init脚本有固定的模板,如下:

#!/bin/sh /etc/rc.common
 
USE_PROCD=1

        /etc/rc.common脚本里面定义了一些函数,但都是空的,例如,start_service(),表示我们需要手动定义start_service函数覆盖掉默认的。接下来解释procd init脚本里面用到的函数的含义,这些接口定义在/lib/functions/procd.sh中。

二. procd init脚本接口

1. procd_open_instance [instance_name]

        打开一个实例,每次配置服务进程之前都需要打开实例,配置完,调用procd_close_instance关闭实例。

2. procd_set_param

        为服务进程设置相应的参数:指定服务进程命令,设置进程命令行参数,环境变量等等,详细如下:

command:指定服务进程的命令,例如:

procd_set_param command /sbin/myservice

respawn:程序退出后,procd会自动将服务进程重启。有三个参数控制服务进程重启:分别是respawn-threshold,respawn-timeout和respawn-retry。示例如下:

procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}

respawn-threshold:如果服务程序存在的时间没有respawn-threshold指定的长,则认为程序已经崩溃,并在respawn-retry指定的次数重试后,程序将停止;如果服务程序存在的时间比respawn-threshold指定的时间长,则不管服务程序如何退出,服务程序都会被重新启动。

respawn-timeout:表示一个服务程序在尝试重新启动之前需要等待多少秒。

respawn-retry:表示当服务进程退出后,procd尝试重新启动服务进程的次数,次数尝试过后,procd认为该服务程序已经崩溃。

env:传递环境变量到服务程序。示例如下:

procd_set_param env ENV_VARIAL=123

        应用程序可以通过getenv函数来获取ENV_VARIAL变量的值。

limits:为程序设置ulimit参数。示例如下:

procd_set_param limits core="unlimited"

file:示例如下:

procd_set_param file /etc/config/network

        表示如果/etc/config/network的内容发生改变,手动运行/etc/init.d/your_service reload后,该服务程序将会重启。

stdout:如果被设置为1,procd则会将服务进程的标准输出内容输出转发到logd进程,在syslog中输出,输出的优先级为LOG_INFO。示例如下:

procd_set_param stdout 1

stderr:如果被设置为1,procd则会将服务进程的标准错误内容输出转发到logd进程,在syslog中输出,优先级为LOG_ERR。示例如下:

procd_set_param stderr 1

pidfile:procd将服务进程的pid写入到指定的文件,用于让其他进程监控或查看该服务进程是否存在。示例如下:

procd_set_param pidfile /var/run/you_service.pid

3. procd_append_param

        为服务进程追加命令行参数。示例如下:

procd_set_param command syslogd 
procd_append_param command -p 8

4. procd_add_reload_trigger

        当系统的配置发生改变时,我们需要服务进程能自动的执行reload操作。我们在service_trigger()函数用procd_add_reload_trigger指定哪些配置改变了要触发/etc/init.d/your_service reload。示例如下:

service_triggers()
{
    procd_add_reload_trigger "network"
}

        注意:/etc/init.d/your_service start时,就会运行service_triggers函数,执行procd_add_reload_trigger "network";示例中代码表示当/etc/config/network文件发生改变时(uci set和uci commit后),然后执行reload_config(如果有配置文件改变,将会通过ubus广播config.change消息)后,才会执行/etc/init.d/your_service reload,不是单纯的/etc/config/network文件修改就会触发

5. procd_add_interface_trigger

        当网络接口的状态发生改变时,调用/etc/init.d/your_service reload使服务进程重新加载。该接口必须和procd_set_param netdev配合使用。示例如下:

start_service()
{
    procd_open_instance
    ....
    procd_set_param netdev eth0.2
    ....
    procd_close_instance

}

service_triggers()
{
    procd_add_interface_trigger "interface.*" "wan" /etc/init.d/myservice restart
}

三. 总结

        本文总结了procd init脚本的接口的使用方法,研究下一些使用的细节,便于后续使用时翻阅。

Guess you like

Origin blog.csdn.net/to_be_better_wen/article/details/130897305