OpenWrt procd

以下介紹OpenWrt中的procd

1. procd 是OpenWrt 中,一個管理進程的process。在開完機之後,可以從ps指令中,看到procd 已被執行。

2. procd主要有包成三個部份:

  • reload_config: 檢查config 是否發生變化,如果有變化則通知procd。
  • procd: 接收使用者的請求、增加或刪除所管理的process,並監控process 的狀態,如果發現process 退出,則再次啟動process。
  • procd.sh: 封裝procd 提供的API,讓使用者可以方便的使用。

3. procd ubus 註冊了service和system兩個服務。

4. 輸入以下指令,可以列出procd 註冊的service 提供的方法。

ubus -v list service

5. 輸入以下指令,可以列出procd service 管理的process。

ubus call service list '{"verbose":true}'

參考上圖,1nvram_deamon2ccci_fsd,即是對應到/etc/init.d/中的shell。

其中列出的資訊,包含process資訊triggersvalidate,如下圖例子。

亦可以透過以下指令,列出指定的process 資訊。

ubus call service list '{"name":"qos","verbose":true}'
其中verbose為true,則列出詳細資訊

6. reload_config shell

/etc/config/*如下圖

file/etc/config下的每一個config 檔案,即為aeehttps-dns-proxynetworkqos等等。

file=qos為例。

uci show qos > /var/run/config.check/qos
MD5FILE=/var/run/config.md5/qos.md5

如果MD5FILE存在,則會用md5sum -c指令,計算/var/run/config.check/qos的md5 值,並與/var/run/config.md5/qos.md5的md5 值比對。

其md5 值若不相同,則使用ubus 指令,發送event,通知procd,其process 的config 檔案有內容發生改變。以file=qos為例,其ubus 發送的指令如下。

ubus call service event '{"type":"config.change","data":{"package":"qos"}}'

當procd 知道config 檔案有變化時,procd 會呼叫/etc/init.d/xxx reload(xxx為相對應的process)來處理相對應的動作,其他config 沒有改變的,就不會浪費資源來進行處理。

md5sum /var/run/config.check/qos > /var/run/config.md5/qos.md5 

最後,將config 檔的md5 值存到/var/run/config.md5 中。

7. 實作

  • /etc/init.d下新增一shell amit_procd如下
#!/bin/sh /etc/rc.common

START=99
STOP=99
USE_PROCD=1

validate_amit_section() {
	uci_validate_section amit interface "${1}" \
	'enabled:bool' \
	'data1:uinteger' \
	'data2:uinteger'
}

service_triggers() {
	procd_add_reload_trigger "amit"
	procd_add_validation validate_amit_section
	echo "amit service_trigger"
}

start_service() {
	echo "amit start service"
}

stop_service() {
	echo "amit stop service"
}

reload_service() {
	date > /tmp/amit_test_service
}
  • /etc/config/下新增一config amit如下
config interface wan        
option enable   1        
option data1    102        
option data2    201
  • 執行以下指令,讓procd 在其service 中增加process 管理。
/etc/init.d/amit_procd start
  • 使用下列指令,確認amit_procd process 是否已經加入procd 的service 管理。
ubus call service list '{"name":"amit_procd","verbose":true}'
  • 修改/etc/config/amit內容並儲存,重新執行reload_config。查看/tmp/amit_test_service內容。

再次修改/etc/config/amit內容並儲存,再重新執行reload_config。查看/tmp/amit_test_service內容,會發現與上一次不一樣,即驗證成功。

  • 可以執行以下指令,讓procd 在其service 中將其管理的process 刪除。
/etc/init.d/amit_procd stop

發佈留言