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脚本的接口的使用方法,研究下一些使用的细节,便于后续使用时翻阅。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenWrt中,开机启动脚本位于/etc/init.d目录下。这些脚本通常是以S开头或K开头,并且有一个数字来表示执行顺序。以S开头的脚本在系统启动时执行,而以K开头的脚本在系统关机时执行。数字越小,脚本执行的优先级越高。 这些启动脚本可以通过enable和disable参数来创建或删除它们的符号链接。当使用enable参数调用启动脚本时,系统会在/etc/rc.d/目录下创建一个以S开头的符号链接,而使用disable参数则会删除该链接。 在启动脚本中,通过定义start()函数来指定在系统启动时要执行的命令,而通过定义stop()函数来指定在系统关机时要执行的命令。在start()函数中可以编写启动应用程序的命令,而在stop()函数中可以编写关闭应用程序的命令。 此外,/etc/rc.d/目录下的脚本还可以调用其他脚本来执行特定的任务。例如,S10boot脚本会调用uci_apply_defaults函数来执行开机时的UCI配置初始化工作,而S20network脚本会使用/sbin/netifd守护进程根据/etc/config/network配置文件来进行网络配置。 综上所述,OpenWrt的开机启动脚本位于/etc/init.d目录下,用于在系统启动或关机时执行特定的任务。通过定义start()和stop()函数可以指定在启动和关闭过程中要执行的命令。同时,通过在/etc/rc.d/目录下创建符号链接可以控制脚本的启用和禁用。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值