以下介紹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