首页 > 科技 > Linux嵌入式,还傻傻使用sleep和看门狗来管理进程吗?PCD了解下

Linux嵌入式,还傻傻使用sleep和看门狗来管理进程吗?PCD了解下

不定期分享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系统进程"看门狗"脚本

这样的进程管理和进程看护,显然不是很规范,而"看门狗"脚本会轮询后台启动的进程,大量的sleep和ps查询,对于硬件配置不高的嵌入式产品就有些浪费资源。

PCD是什么,能够做什么?

Process Control Daemon简称PCD,过程控制守护程序,主要用于基于Linux的嵌入式产品,是开源的、轻量级系统管理,可以减少系统的启动时间并增强系统的可靠性。

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

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
└── 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"

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 = [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
#是否自动激活

从PCD的规则脚本可以看出PCD对于进程管理做出了充分考虑,可以指定进程启动的前置条件或进程启动失败后的动作,是守护该进程,是否自动激活等。

最后展示一下PCD的启动关系示例

到这里PCD的介绍就完毕了,最后我们可以使用PCD自带的工具禅城dot文件,来生成各个进程启动的依赖关系,如下图:

PCD进程启动关系示例图

从图中,我们可以很清晰看出各个进程的依赖关系,让我们更方便的管理和展示,同时可以替代watchdog来自动启动崩溃的进程,到此PCD的编译和使用说明完毕。

最后喜欢大叔文章的可以关注我哦,欢迎大家评论留言。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/208012.html