openwrt 之 procd init 脚本
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.commonUSE_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重启这个deamoreprocd_set_param stdout 1 procd_set_param stderr 1 :将标准输出和标准输入重定向到logd中,同时等级为infoprocd_set_param pidfile /var/run/somefile.pid:程序启动时写入自己的pid到这个文件,方便其他进程查看该服务是否运行service_triggers()procd_add_reload_trigger "file1 file2"::当配置文件file1或file2改变时,执行reload_config,将会通过ubus广播config.change消息,才会再去执行这个reloadprocd_add_interface_trigger:->需要配合 procd_set_param netdev eth0.2 使用 如:start_service ->增加 procd_set_param netdev eth0.2service_triggers ->增加 procd_add_interface_trigger "interface.*" "wan" /etc/init.d/myservice restart
3,一个例子
#!/bin/sh /etc/rc.commonUSE_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_instanceprocd_set_param command $PROGRAM procd_append_param command -p 8procd_set_param stdout 1procd_close_instance
}
custom() {echo "mytest is a test cmd."
}
4,一些小方法
//判断一个服务是否启动中
/etc/init.d/rs_mytest enabled && echo on//脚本在还可追加
boot() {echo "在设备起来时,调用一次"
}
shutdown() {echo "在设备关机时,调用一次"
}