返回目录:电脑怎么了
不定期分享linux系统、shell脚本相关文章,喜欢大叔的作品,请关注我,本文在头条原创首发,未经许可禁止转载。前言
Linux嵌入式系统的进程启动,大多数是在rcS脚本之后启动各个业务模块,使用sleep命令控制脚本的间隔时间,比如脚本是这样。
#!/bin/bashexport 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系统进程"看门狗"脚本
这样的进程管理和进程看护,显然不是很规范,而"看门狗"脚本会轮询后台启动的进程,大量的sleep和ps查询,对于硬件配置不高的嵌入式产品就有些浪费资源。
PCD是什么,能够做什么?
Process Control Daemon简称PCD,过程控制守护程序,主要用于基于Linux的嵌入式产品,是开源的、轻量级系统管理,可以减少系统的启动时间并增强系统的可靠性。
Process Control Daemon
- 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.shpcd-1.1.6/examples/graph.txtpcd-1.1.6/examples/etc/pcd-1.1.6/examples/etc/scripts/pcd-1.1.6/examples/etc/scripts/product.pcdpcd-1.1.6/examples/etc/scripts/system.pcdpcd-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
PCD配置项主菜单
在这个菜单中我们可以选择平台、设备交叉编译器、设置安装的目录等。我们依次进入来选择需要编译的平台,如下图:
PCD Configuration -->PCD Compile time configurations --->Target Platform type (X86) --->
选择PCD编译的平台ARM、MIPS等
也可以配置PCD的安装目录、头文件目录或者开启其他选项信息等。
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,下图是编译过程。
PCD编译过程
编译完毕会在pcd目录产生一个bin目录,我们需要的程序和lib都在这个目录。
[root@api bin]# tree -l.├── host└── target ├── lib │ ├── libipc.so │ └── libpcd.so └── usr └── sbin └── pcd5 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"
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.pcdINCLUDE = ./env.pcd#此路径需要写绝对路径
具体的脚本规则是:
RULE = HSG_PROC1START_COND = NONECOMMAND = /xxx/bin/proc1 > /dev/nullSCHED = NICE,0DAEMON = YESEND_COND = NONEEND_COND_TIMEOUT = -1FAILURE_ACTION = RESTARTACTIVE = YES
脚本规则详细说明如下:
RULE = SYSTEM_PROC#规则名称,格式: 文件前缀_程序名称START_COND = {NONE | FILE,[filename] | RULE_COMPLETED,[rule],.. | NET_DEVICE,[netdev] | IPC_OWNER,[owner] | ENV_VAR,[variable,value]}#前置条件可以判断文件,网卡,变量,规则等是否就绪COMMAND = 从PCD的规则脚本可以看出PCD对于进程管理做出了充分考虑,可以指定进程启动的前置条件或进程启动失败后的动作,是守护该进程,是否自动激活等。 到这里PCD的介绍就完毕了,最后我们可以使用PCD自带的工具禅城dot文件,来生成各个进程启动的依赖关系,如下图: PCD进程启动关系示例图 从图中,我们可以很清晰看出各个进程的依赖关系,让我们更方便的管理和展示,同时可以替代watchdog来自动启动崩溃的进程,到此PCD的编译和使用说明完毕。 最后喜欢大叔文章的可以关注我哦,欢迎大家评论留言。
最后展示一下PCD的启动关系示例