以下介紹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_deamon、2ccci_fsd,即是對應到/etc/init.d/中的shell。
其中列出的資訊,包含process資訊、triggers和validate,如下圖例子。
亦可以透過以下指令,列出指定的process 資訊。
ubus call service list '{"name":"qos","verbose":true}'
其中verbose為true,則列出詳細資訊
6. reload_config shell
/etc/config/*如下圖故file為/etc/config下的每一個config 檔案,即為aee、https-dns-proxy、network、qos等等。
以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/下新增一configamit如下
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
