以下介紹OpenWrt中的procd
1. procd 是OpenWrt 中,一個管理進程的process。在開完機之後,可以從ps
指令中,看到procd 已被執行。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/ps.webp?resize=715%2C338&ssl=1)
2. procd
主要有包成三個部份:
reload_config
: 檢查config 是否發生變化,如果有變化則通知procd。procd
: 接收使用者的請求、增加或刪除所管理的process,並監控process 的狀態,如果發現process 退出,則再次啟動process。procd.sh
: 封裝procd 提供的API,讓使用者可以方便的使用。
3. procd 向
ubus 註冊了service和system兩個服務。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/ubus_list.webp?resize=280%2C509&ssl=1)
4. 輸入以下指令,可以列出procd 註冊的service 提供的方法。
ubus -v list service
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/ubus_v.webp?resize=797%2C250&ssl=1)
5. 輸入以下指令,可以列出procd service 管理的process。
ubus call service list '{"verbose":true}'
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/ubus_call_service.webp?resize=584%2C628&ssl=1)
參考上圖,1nvram_deamon
、2ccci_fsd
,即是對應到/etc/init.d/
中的shell。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/etc_initd_ls.webp?resize=582%2C344&ssl=1)
其中列出的資訊,包含process資訊
、triggers
和validate
,如下圖例子。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/triggers_validate.webp?resize=623%2C877&ssl=1)
亦可以透過以下指令,列出指定的process 資訊。
ubus call service list '{"name":"qos","verbose":true}' 其中verbose為true,則列出詳細資訊
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/service_qos.webp?resize=626%2C665&ssl=1)
6. reload_config shell
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/reload_config_shell.webp?resize=960%2C458&ssl=1)
/etc/config/*
如下圖![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/etc_config_ls.webp?resize=543%2C170&ssl=1)
故file
為/etc/config
下的每一個config 檔案,即為aee
、https-dns-proxy
、network
、qos
等等。
以file=qos
為例。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/reload_config_shell1.webp?resize=479%2C22&ssl=1)
uci show qos > /var/run/config.check/qos
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/reload_config_shell2.webp?resize=340%2C21&ssl=1)
MD5FILE=/var/run/config.md5/qos.md5
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/reload_config_shell3.webp?resize=925%2C120&ssl=1)
如果MD5FILE
存在,則會用md5sum -c
指令,計算/var/run/config.check/qos
的md5 值,並與/var/run/config.md5/qos.md5
的md5 值比對。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/md5.webp?resize=536%2C38&ssl=1)
其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 沒有改變的,就不會浪費資源來進行處理。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/reload_config_shell4.webp?resize=417%2C25&ssl=1)
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
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/amit1.webp?resize=395%2C54&ssl=1)
- 使用下列指令,確認amit_procd process 是否已經加入procd 的service 管理。
ubus call service list '{"name":"amit_procd","verbose":true}'
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/amit2.webp?resize=695%2C661&ssl=1)
- 修改
/etc/config/amit
內容並儲存,重新執行reload_config
。查看/tmp/amit_test_service
內容。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/amit3.webp?resize=391%2C78&ssl=1)
再次修改/etc/config/amit
內容並儲存,再重新執行reload_config
。查看/tmp/amit_test_service
內容,會發現與上一次不一樣,即驗證成功。
![](https://i0.wp.com/mintrabbitplus.com/wp-content/uploads/2023/07/amit4.webp?resize=392%2C59&ssl=1)
- 可以執行以下指令,讓procd 在其service 中將其管理的process 刪除。
/etc/init.d/amit_procd stop