嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

不定期分享linux系統、shell腳本相關文章,喜歡大叔的作品,請關注我,本文在頭條原創首發,未經許可禁止轉載。 

前言

Linux嵌入式系統的進程啟動,大多數是在rcS腳本之後啟動各個業務模塊,使用sleep命令控制腳本的間隔時間,比如腳本是這樣。

#!/bin/bash
export PATH="/xxx/bin:$PATH"
export LD_LIBRARY_PATH="/xxx/lib:$LD_LIBRARY_PATH"

/xxx/bin/proctest1 1>/dev/null 2>&1 &
slepp 1
/xxx/bin/proctest2 1>/dev/null 2>&1 &
sleep 1

...

而一些進程需要依賴Linux系統的環境或者某一個進程就緒後才繼續啟動其他進程,比如某一個網卡是否啟動,我們常用grep命令來過濾是否就緒,比如這樣:

ifconfig |grep lanxx 
或者
ps x|grep [p]rocxx

[ $? -eq 0 ] && /xxx/bin/porc1

或者我們擔心進程在某些情況下是否掛掉,我在啟動腳本的最後還需要啟動一個app_watchdog腳本定時來檢查腳本是否存在,比如腳本是這樣:

嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

linux系統進程"看門狗"腳本

這樣的進程管理和進程看護,顯然不是很規範,而"看門狗"腳本會輪詢後臺啟動的進程,大量的sleep和ps查詢,對於硬件配置不高的嵌入式產品就有些浪費資源。

PCD是什麼,能夠做什麼?

Process Control Daemon簡稱PCD,過程控制守護程序,主要用於基於Linux的嵌入式產品,是開源的、輕量級系統管理,可以減少系統的啟動時間並增強系統的可靠性。

嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

Process Control Daemon

  • PCD能夠做什麼
  1. 增強對系統中所有流程的控制和監視
  2. 減少系統的啟動時間
  3. 何時啟動每個進程,啟動前需要依賴哪些資源,啟動失敗該做什麼操作
  4. 改善系統的穩定性
  5. 形成進程啟動的圖形關係表

PCD軟件的編譯安裝

既然PCD主要用於嵌入式產品中,它支持的架構有:ARM、MIPS、X86、X64。這裡我使用centos6.7x64來進行說明。

  • 首先我們下載PCD軟件
wget https://excellmedia.dl.sourceforge.net/project/pcd/pcd-sdk-latest.tar.bz2
  • 解壓PCD軟件
[root@api PCD]# tar -jxvf pcd-sdk-latest.tar.bz2 
pcd-1.1.6/
pcd-1.1.6/examples/
pcd-1.1.6/examples/parse-rules.sh
pcd-1.1.6/examples/graph.txt
pcd-1.1.6/examples/etc/
pcd-1.1.6/examples/etc/scripts/
pcd-1.1.6/examples/etc/scripts/product.pcd
pcd-1.1.6/examples/etc/scripts/system.pcd
pcd-1.1.6/examples/etc/scripts/component.pcd

...
  • 配置PCD

PCD支持通過Kconfig配置引擎配置PCD,類似於Linux Kernel配置方法,這裡使用make menuconfig在文本菜單中配置PCD,如下圖:

[root@api pcd-1.1.6]# make menuconfig
嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

PCD配置項主菜單

在這個菜單中我們可以選擇平臺、設備交叉編譯器、設置安裝的目錄等。我們依次進入來選擇需要編譯的平臺,如下圖:

PCD Configuration -->
PCD Compile time configurations --->
Target Platform type (X86) --->
嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

選擇PCD編譯的平臺ARM、MIPS等

也可以配置PCD的安裝目錄、頭文件目錄或者開啟其他選項信息等。

嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

PCD安裝目錄和其他信息

對於交叉編譯我們需要設備編譯器、頭文件、依賴的庫等,可以通過環境變量來配置:

export CC=armeb-linux-uclibceabi-gcc
#配置編譯器
export INCLUDE_DIR_PREFIX=/your_dir/include
#配置頭文件目錄
export INSTALL_DIR_PREFIX=/your_dir/INSTALL_DIR
#配置最後安裝的目錄
export LIB_DIR_PREFIX=/your_dir/lib
#配置需要依賴的庫文件

export CONFIG_ARM=y
#配置平臺文件需要和編譯器對應
#其他為:CONFIG_X86 或 CONFIG_MIPS 或CONFIG_X64
  • 編譯PCD軟件

在配置完畢後需要編譯PCD軟件了,直接make,下圖是編譯過程。

嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

PCD編譯過程

編譯完畢會在pcd目錄產生一個bin目錄,我們需要的程序和lib都在這個目錄。

[root@api bin]# tree -l
.
├── host
└── target
├── lib
│ ├── libipc.so
│ └── libpcd.so
└── usr
└── sbin
└── pcd

5 directories, 3 files

上面 user/bin/pcd 就是PCD程序,libipc.so,libpcd.so是pcd啟動時需要依賴的庫文件,在部署的時候需要將這兩個庫文件放到動態鏈接庫的目錄,比如這樣做:

export LD_LIBRARY_PATH="/xxx/lib:$LD_LIBRARY_PATH"

至此,PCD的編譯就完畢了,而對PCD規則管理和使用,下面繼續講解。

PCD的腳本文件和規則配置

首先我們看一下PCD程序的說明

[root@api sbin]# export LD_LIBRARY_PATH="/usr/lib:$LD_LIBRARY_PATH"
嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

PCD程序幫助說明

得到PCD的幫助說明後,我們可以這樣啟動PCD程序。

./pcd -f ./product.pcd -t 200 -v -d -e /log/pcderror.log
-f :指定規則文件
-v :顯示詳細信息
-d :顯示調試信息
-t :指定規則間隔時間200ms
-e :指定pcd錯誤日誌路徑

對於PCD規則腳本我們可以定義一個住腳本,包含其它多個規則腳本,在上面的product.pcd 腳本中可以這樣定義,如下:

INCLUDE = ./system.pcd
INCLUDE = ./env.pcd
#此路徑需要寫絕對路徑

具體的腳本規則是:

RULE = HSG_PROC1
START_COND = NONE
COMMAND = /xxx/bin/proc1 > /dev/null
SCHED = NICE,0
DAEMON = YES
END_COND = NONE
END_COND_TIMEOUT = -1
FAILURE_ACTION = RESTART
ACTIVE = YES

腳本規則詳細說明如下:

RULE = SYSTEM_PROC
#規則名稱,格式: 文件前綴_程序名稱

START_COND = {NONE | FILE,[filename] | RULE_COMPLETED,[rule],..
| NET_DEVICE,[netdev] | IPC_OWNER,[owner] | ENV_VAR,[variable,value]}
#前置條件可以判斷文件,網卡,變量,規則等是否就緒

COMMAND = <full> [parameters] [$variable]
#啟動參數,可以使用變量,在執行前使用export宣告變量即可

SCHED = NICE,-19..19 | FIFO,1..99
#程序啟動優先級

DAEMON = YES | NO
#是否守護該進程,也就是代替watchdog腳本

END_COND = NONE | FILE,[filename] | NET_DEVICE,[netdevice]
| WAIT,[delay] | EXIT,[status] | IPC_OWNER,[owner]
#結束前的提交,可以額是判斷文件,網卡,等待,對出狀態等。

END_COND_TIMEOUT = -1 | 0..99999
#結束超時時間,一般是-1,不設置

FAILURE_ACTION = NONE | REBOOT | RESTART | EXEC_RULE
#進程啟動失敗時的動作

ACTIVE = YES | NO
#是否自動激活/<full>

從PCD的規則腳本可以看出PCD對於進程管理做出了充分考慮,可以指定進程啟動的前置條件或進程啟動失敗後的動作,是守護該進程,是否自動激活等。

最後展示一下PCD的啟動關係示例

到這裡PCD的介紹就完畢了,最後我們可以使用PCD自帶的工具禪城dot文件,來生成各個進程啟動的依賴關係,如下圖:

嵌入式Linux進程管理PCD,告別sleep控制的腳本,告別“看門狗”

PCD進程啟動關係示例圖

從圖中,我們可以很清晰看出各個進程的依賴關係,讓我們更方便的管理和展示,同時可以替代watchdog來自動啟動崩潰的進程,到此PCD的編譯和使用說明完畢。

最後喜歡大叔文章的可以關注我哦,歡迎大家評論留言。 


分享到:


相關文章: