通常的嵌入式系统均有一个守护进程,该守护进程监控系统进程的状态,如果某些系统进程异常退出,将再次启动这些进程。procd 就是这样一个进程,它是使用C语言编写的,一个新的 OpenWrt 进程管理服务。它通过init脚本来将进程信息加入到 procd 的数据库中来管理进程启动,这是通过ubus总线调用来实现,可以防止进程的重复启动调用。

procd 的进程管理功能主要包含 3 个部分。

  • reload_config,检查配置文件是否发生变化,如果有变化则通知 procd 进程。
  • procd,守护进程,接收使用者的请求,增加或删除所管理的进程,并监控进程的状态,如果发现进程退出,则再次启动进程。
  • procd.sh,提供函数封装procd提供系统总线方法,调用者可以非常便利的使用procd 提供的方法。
root@zihome:/etc/init.d# cat /var/run/config.md5
b9f0f9179b5b407ff85430da41877ba3  /var/run/config.check/dhcp
ce8e9fffa77a896c43cdeb2b83dede88  /var/run/config.check/dropbear
92a19521dd5c8cacd08e64e2785d94b1  /var/run/config.check/firewall
736bccfcc298fcdac1016da5f58518e1  /var/run/config.check/fstab
751c2e2ff80f2952b4c866fbc1d52f7d  /var/run/config.check/guide
b9111c52e6db67b7bf550d5701a44e5f  /var/run/config.check/htpdate
bad4e7384734245500ed9c081e0009f5  /var/run/config.check/igmpproxy
645f0a3cbfd1cf565b920dfd897af0c5  /var/run/config.check/network
3165f4af5f45e3209f9e20e28a78a76a  /var/run/config.check/rpcd
87701d34b6de4ec46e6cb5edf1ac5f74  /var/run/config.check/system
6ec4ee52ca677ac87ff2469607a8cf9f  /var/run/config.check/uhttpd
0ba26b28318a2a2d879fdad87f8e8c56  /var/run/config.check/upnpd
775e2ac3058da3ea2e973b3747233b92  /var/run/config.check/webpage
009ba5a3f9130b74662822d36d3ecd37  /var/run/config.check/wifidev
741a39d373e3c6f2dbeff47ca145606b  /var/run/config.check/wireless
af357fab720926629ad9ab2ff4f465e1  /var/run/config.check/zihome
e2e3d1e8532386200a708f0c6837830c  /var/run/config.check/zqos

如果在自己的启动脚本中定义了 USE_PROCD 那就调用这些函数。在 rc.common 中重
新定义了 start 函数,相当于重载了这些函数。

函 数 含 义
start_service 向 procd 注册并启动服务,是将在 services 所管理对象里面增加了一项
stop_service 让 procd 解除注册,并关闭服务, 是将在 services 中的管理对象删除
service_triggers 配置文件或网络接口改变之后触发服务重新读取配置
service_running 查询服务的状态
reload_service 重启服务,如果定义了该函数,在 reload 时将调用该函数,否则再次调用 start 函数
service_started 用于判断进程是否启动成功

举例:

通常有两行内容是固定的,第一
行表示使用“/etc/rc.common”来解释脚本。
第二行内容设置 USE_PROCD 变量为 1,表示使
用 procd 来管理进程

(1)pprocd_open_instance 开始增加一个服务实例。

(2)procd_set_param 设置服务实例的参数值,通常会有以下几种类型的参数。

  • command: 服务的启动命令行。
  • respawn: 进程意外退出的重启机制及策略,它需要有 3 个设置值。第一个设置为判断异常失败边界值(threshold),默认为3600秒,如果小于这个时间退出,则会累加重新启动次数,如果大于这个临界值,则将重启次数置 0。第二个设置为重启延迟时间(timeout),将在多少秒后启动进程,默认为5秒。第三个设置是总的失败重启次数(retry),是进程永久退出之前的重新启动次数,超过这个次数进程退出之后将不会再启动。默认为 5 次。也可以不带任何设置,那这些设置都是默认值。
  • env:进程的环境变量。
  • file:配置文件名,比较其文件内容是否改变。
  • netdev:绑定的网络设备(探测 ifindex 更改)。
  • limits:进程资源限制。
    每次只能使用一种类型参数,其后是这个类型参数的值。

(3)procd_close_instance 完成进程实例的增加。

vim /etc/init.d/zdetect

#!/bin/sh /etc/rc.common
USE_PROCD=1START=88
STOP=92start_service() {procd_open_instanceprocd_set_param command /usr/bin/zdetectprocd_set_param respawn[ -e /proc/sys/kernel/core_pattern ] && {procd_set_param limits core="unlimited"}procd_close_instance
}

vim /etc/init.d/zboard

#!/bin/sh /etc/rc.common
USE_PROCD=1START=18
STOP=82start_service() {procd_open_instancelocal wan_port=$(uci -q get zihome.system.wanport)local wan_status=0[ -z "$wan_port" ] && {wan_port=0}if [ -f /tmp/status/wan_port_status ]; thenwan_status=$(cat /tmp/status/wan_port_status)fiprocd_set_param command /usr/bin/zboard -p $wan_port -s $wan_statusprocd_set_param respawn[ -e /proc/sys/kernel/core_pattern ] && {procd_set_param limits core="unlimited"}procd_close_instance
}stop_service() {local zboard_pid=""zboard_pid=`ps -w | grep -w "/usr/bin/zboard" | grep -v grep| awk '{print $1}'`if [ "${zboard_pid}" != "" ];thenkill -9 ${zboard_pid}fi}

(4)procd_add_reload_trigger,增加配置文件触发器,每次配置文件的修改,如果调用了reload_config时,当前实例都被重启。有一个可选的参数为配置文件名称。其实它在内部是调用procd_open_trigger、procd_add_config_trigger和procd_close_trigger这3个函数来增加触发器。

(5)procd_open_validate,打开一个验证数组,是和 procd_close_validate 函数一起使用。

(6)procd_close_validate,关闭一个验证数组。示例 8-9 是软件包 firewall使用procd来对防火墙配置的触发器和验证。

(7)procd_open_service(name, [script]),至少需要一个参数,第一个参数是实例名称,第二个参数是可选参数为启动脚本。该函数仅在在rc.common 中调用,用于创建一个新的procd进程服务消息。

(8)procd_close_service,该函数不需要参数,仅在 rc.common 中调用,完成进程管理服务的增加。

(9)procd_kill,杀掉服务实例(或所有的服务实例)。至少需要一个参数,第一个参数是服务名称,通常为进程名,第二个是可选参数,是进程实例名称,因为可能有多个进程示例,如果不指定所有的实例将被关闭。该函数在 rc.common 中调用,用户从命令行调用 stop 函数时会使用该函数杀掉进程。

(10)uci_validate_section,调用 validate_data 命令注册为验证服务。在配置发生改变后对配置文件的配置项合法性进行校验。验证服务是在进程启动时通过 ubus 总线注册到procd进程中。输入以下命令,可以看到系统所有注册的验证服务。

作者:Creator_Ly
链接:https://www.jianshu.com/p/acd2ccb5ea8d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Openwrt procd守护进程相关推荐

  1. openwrt 守护进程如何设置 respawn参数

    openwrt 守护进程如何设置 respawn参数 START=18USE_PROCD=1 PROG=/usr/sbin/testprostart_service() {procd_open_ins ...

  2. 使用procd执行进程

    在openwrt系统内init进程被procd取代,procd作为父进程可以监控子进程的状态.一旦子进程退出后即可在某一个时刻尝试进行重启进程.在op系统内使用procd监控的有uhttpd,neti ...

  3. PPP 守护进程 RCE 漏洞已存在17年,可控制几乎所有的 Linux 系统

    聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 US-CERT 发布安全公告称,PPP 守护进程 (pppd) 软件中存在一个已有17年之久的远程代码执行 (RCE) 漏洞,影响几乎所 ...

  4. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

    1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...

  5. php 一秒操作一次_php守护进程 加linux命令nohup实现任务每秒执行一次

    Unix中 nohup 命令功能就是不挂断地运行命令,同时 nohup 把程序的所有输出到放到当前目录 nohup.out 文件中,如果文件不可写,则放到 /nohup.out 文件中.那么有了这个命 ...

  6. python中的daemon守护进程实现方法

    守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件.他们常常在系统引导装入时启动,在系统关闭时终止. 守护进程的特性 1.在后台运行 2.与其运行前的环境 ...

  7. Linux守护进程实现

    Linux守护进程 redis版: void daemonize(void) {int fd;if (fork() != 0) exit(0); /* parent exits */setsid(); ...

  8. 守护进程中创建的对象php,在PHP中生成守护进程(Daemon Process)

    前两天看到一篇文章<如何使用PHP编写daemon process>,其中对核心代码却没有细说,我又查了一些资料,还看了一本<理解Unix进程>,才搞明白生成守护进程的时候发生 ...

  9. Linux06-服务、守护进程和systemd

    目录 一.简介systemd 二.使用systemd 2.1.systemctl命令与systemd单元 2.2.控制系统服务 一.简介systemd RHEL6及以前,系统启动和服务器进程是由第一个 ...

最新文章

  1. OpenAI与GitHub联手推出AI代码生成工具,比GPT-3更强大
  2. MJExtension 模型嵌套模型数组
  3. java在线聊天项目0.4版本 制作服务端接收连接,客户端连接功能 新增客户端窗口打开时光标指向下边文本域功能,使用WindowListener监听WindowAdapter...
  4. 【响应式Web前端设计】H5原生表单验证
  5. PHP登录密码的生成与验证
  6. Lombok@Builder和@NoArgsConstructor冲突
  7. oracle 更新flwid,Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法
  8. 一个前端博客(7)——事件绑定和移除事件
  9. mysql 管理工具 绿色_飘云MySQL管理工具(MySQL数据库管理助手)V1.1 最新版
  10. Activemq下载与安装
  11. RFID射频识别系统简述
  12. RQNOJ-19 篝火晚会
  13. Cain嗅探工具的基本使用
  14. error A2070:invalid instruction operands 错误原因
  15. 2022年化工自动化控制仪表考试及化工自动化控制仪表考试内容
  16. IOS中使用getUserMedia获取视频流展示到video中,进行人脸识别
  17. pytho语法总结(1):基础知识,列表介绍,列表操作
  18. matlab中符号函数sgn,编程里的函数符号都是什么意思?
  19. 什么是微信不死域名 微信不死域名的原理是什么
  20. 大数据之Linux 基础

热门文章

  1. 登陆ArcGIS Server Manager页面,点击Manager Service页面报错:工作站服务没有启动
  2. 无法启动此程序因为计算机中丢失d3dx942,《骑马与砍杀》游戏运行时提示缺少d3dx9_42.dll怎么办?...
  3. 实际中常用的一个随机数产生器
  4. 编程语言win10电源管理在哪里
  5. 基于asp.net枪弹管理系统的设计与实现#毕业设计
  6. TcaplusDB君 · 行业新闻汇编(8月10号)
  7. python千人成像_Phptoshop怎么制作一个千人成像照片拼图?
  8. caffe在windows平台上的编译
  9. linux 内核编译_如何在21世纪编译Linux内核
  10. ElasticSearch性能调优