1,引入
在openwrt中,/ect/init.d/*有很多脚本,在/etc/rc.d/下 会有这个 脚本的软连接,其中以数字开头(start = 99,相同时以首字母为调用顺序),这些脚本用于管理进程的启动,这些进程的启动和脚本都由守护进程--procd管理,下面解释procd init脚本的使用方法。参考链接:
[OpenWrt Wiki] Procd Init Scripts
2,procd init脚本接口的使用
查看当前服务支持的CMD行:
/etc/init.d/rs_mytest [arg] :不带任何[arg]参数,查看当前支持的CMD

上面的脚本中增加了一个自定义的CMD--custom (也可增加多个),如何使用这个命令:
/etc/init.d/rs_mytest custom
下面是procd init 脚本的一下接口API:
#!/bin/sh /etc/rc.common
USE_PROCD=1
注:
/etc/rc.common 脚本中定义了很多函数,如start_service等,
我们需要再自己的脚本中去复写这些函数体。
procd_open_instance :打开一个实例,配置完,调用procd_close_instance关闭实例。
procd_set_param command /usr/sbin/mytest :配置执行的命令
procd_append_param command -p 8 :追加命令行参数
service_start():
procd_set_param env my_env_var=function
:为进程传递环境,进程可以通过get_env获取该环境变量
procd_set_param limits core="unlimited"
:为进程设置ulimit参数
procd_set_param file /var/etc/your_service.conf
:为进程设置,当/var/etc/your_service.conf 这个文件改变了的话,将调用reload重启这个deamore
procd_set_param stdout 1
procd_set_param stderr 1
:将标准输出和标准输入重定向到logd中,同时等级为info
procd_set_param pidfile /var/run/somefile.pid
:程序启动时写入自己的pid到这个文件,方便其他进程查看该服务是否运行
service_triggers()
procd_add_reload_trigger "file1 file2":
:当配置文件file1或file2改变时,执行reload_config,将会通过ubus广播config.change消息,
才会再去执行这个reload
procd_add_interface_trigger:
->需要配合 procd_set_param netdev eth0.2 使用
如:
start_service ->增加
procd_set_param netdev eth0.2
service_triggers ->增加
procd_add_interface_trigger "interface.*" "wan" /etc/init.d/myservice restart
3,一个例子
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
STOP=99
PROGRAM=/usr/sbin/mytest
EXTRA_COMMANDS="custom"
EXTRA_HELP="-- custom help for the custom command"
service_triggers() {
procd_add_reload_trigger "rs_mytest"
}
start_service()
{
procd_open_instance
procd_set_param command $PROGRAM
procd_append_param command -p 8
procd_set_param stdout 1
procd_close_instance
}
custom() {
echo "mytest is a test cmd."
}
4,一些小方法
//判断一个服务是否启动中
/etc/init.d/rs_mytest enabled && echo on
//脚本在还可追加
boot() {
echo "在设备起来时,调用一次"
}
shutdown() {
echo "在设备关机时,调用一次"
}

6647

被折叠的 条评论
为什么被折叠?



