智能路由器开发之创建一个procd init脚本示例

news/2024/5/10 2:34:32/文章来源:https://blog.csdn.net/u011897062/article/details/130806392

openwrt

智能路由器开发之创建一个procd init脚本示例

Procd init脚本默认提供了许多好用的功能,例如重启策略和能够从UCI系统中存储和读取配置。

设置

举个例子,假设我们想创建一个作为服务的Shell脚本,并且这个服务可以通过消息和超时时间进行配置,以便提醒我们时不时地离开座位休息一下。我们的服务名称将为"myservice",它依赖于以下脚本。

#!/bin/sh#these if statements will check input and place default values if no input is given
#they will also check if input is a number so you can call 
#this script with just a time and it will still work correctlyif [ "$1" = '' ]; thenname="You"
elseif echo "$1" | egrep -q '^[0-9]+$'; thenname="You"elsename="$1"fi
fiif [ "$2" = '' ]; thenevery="5"
elseevery="$2"
fiif echo "$1" | egrep -q '^[0-9]+$'; thenevery="$1"
fi#endless loop, will print the message every X seconds as indicated in the $every variablewhile [ 1 ]; do echo "Hey, $name, it's time to get up"sleep $every
doneexit 0

将脚本放置在 /var/myscript.sh下,并在OpenWrt上运行测试

$ /bin/sh /var/myscript.sh "Name Surname"

openwrt web

创建一个基本的procd脚本

既然我们有一个可用的脚本,我们可以将其转化为一个服务。在"/etc/init.d/myservice"路径下创建一个文件,并将以下内容添加到文件中。

#!/bin/sh /etc/rc.common
USE_PROCD=1
START=95
STOP=01
start_service() {procd_open_instanceprocd_set_param command /bin/sh "/var/myscript.sh"procd_close_instance
}

首先,它包含了一个服务所需的常用的"/etc/rc.common"文件,该文件定义了几个函数,用于管理服务的生命周期,它支持旧式的init脚本和procd脚本。为了告诉系统我们要使用新的样式,我们设置了USE_PROCD标志。

START选项基本上告诉系统在OpenWrt启动和关闭期间,服务应该何时启动和停止。

目前这个init脚本并不是很有用,但它展示了我们将进一步开发脚本所需的基本构建模块。

启用服务

告诉OpenWrt我们有一个新的服务将要运行

/etc/init.d/myservice enable

这将在目录"/etc/rc.d/“中为我们安装一个符号链接,名称为"S90myservice”,它指向位于"/etc/init.d/“中的相应服务脚本。OpenWrt将根据”/etc/rc.d/"中S*脚本的顺序启动服务。要查看顺序,您可以简单地运行以下命令:

$ ls -la /etc/rc.d/S*

能够影响服务启动顺序非常有用,如果我们的服务依赖于网络,我们需要确保START顺序的索引至少比网络服务的START顺序大1。

对于可选的STOP参数,同样适用相同的规则,只是这次它定义了服务关闭的顺序。要查看激活的关闭脚本,您可以运行以下命令:

$ ls -la /etc/rc.d/K*

您总是需要在脚本中定义一个STARTSTOP序列(您也可以同时定义两者)。如果您定义了STOP序列,您还需要在初始化脚本中定义一个stop_service()处理程序。该处理程序通常负责清理服务资源或在服务重新启动时需要的数据持久化。测试服务

最后,让我们测试一下我们的服务。打开第二个终端连接到OpenWrt设备,并运行以下命令:

$ logread -f

这将在设备上跟踪系统日志。然后启用(如果尚未启用)并启动服务。

$ /etc/init.d/myservice enable
$ /etc/init.d/myservice start

大约5秒后,我们应该在日志中看到消息重复出现,但实际上并没有…我们仍然需要将stdout和stderr重定向到logd,以便在系统日志中看到console.log的输出,使用procd_set_param stdout 1设置log输出终端。

#!/bin/sh /etc/rc.commonUSE_PROCD=1START=95
STOP=01start_service() {procd_open_instanceprocd_set_param command /bin/sh "/var/myscript.sh"procd_set_param stdout 1procd_set_param stderr 1procd_close_instance
}

重启服务后,使用logread -f命令,我们能看到下面的log输出:

$ logread -f
... ommitted ... Hey, You, it's time to get up
... ommitted ... Hey, You, it's time to get up
... ommitted ... Hey, You, it's time to get up
... ommitted ... Hey, You, it's time to get up
... ommitted ... Hey, You, it's time to get up
... ommitted ... Hey, You, it's time to get up
...

像上面那样设置一个简单的procd脚本已经给我们带来了一些优势:

  • 共享的API来管理服务
  • 该服务将在每次启动时自动启动
    openwrt web

服务配置

是时候变得更加个性化了,为此我们将使用OpenWrt的UCI配置界面。创建一个名为/etc/config/myservice的配置文件,内容如下:

config myservice 'hello'option name 'Joost'option every '5'

UCI将立即识别这个配置,并且可以像下面这样查看我们服务的配置:

$ uci show myservice
myservice.hello=myservice
myservice.hello.name=Joost
myservice.hello.every='5'

也可以单个选项单独设置

$ uci get myservice.hello.name

也可以修改UCI配置项

$ uci set myservice.hello.name=Knight
$ uci commit

现在,我们将对服务脚本进行一些更改,以便在脚本中读取和使用配置。

加载服务配置项

我们已经可以通过将参数传递给节点脚本来传递配置。我们需要做的唯一事情是加载与配置匹配的服务,将我们需要的选项的值存储到某些变量中,并将它们传递给启动脚本的命令。

#!/bin/sh /etc/rc.commonUSE_PROCD=1START=95
STOP=01CONFIGURATION=myservicestart_service() {# Reading configconfig_load "${CONFIGURATION}"local namelocal everyconfig_get name hello nameconfig_get every hello everyprocd_open_instance# pass config to script on startprocd_set_param command /bin/sh "/var/myscript.sh" "$name" "$every"procd_set_param file /etc/config/myserviceprocd_set_param stdout 1procd_set_param stderr 1procd_close_instance
}

我们也可以通过下面的命令传递新的配置项

$ uci set myservice.hello.name=Woodrow Wilson Smith
$ uci commit

请注意,在服务脚本中,参数被引号引起来,这样我们就可以在name选项中使用空格。如果我们不这样做,每个名称部分都将被视为单独的参数。

除了加载和传递配置到我们的脚本之外,我们还添加了其他内容。

#//
procd_set_param file /etc/config/myservice
#//

有了这行代码,我们只需要在配置发生更改时重新启动服务。

$ /etc/init.d/myservice reload

openwrt acc

高级选项

还有一些在procd脚本的"instance block"中可以配置的选项,这些选项可能会很有用。我在这里列举了一些,但并不意味着包含了所有内容。

  • respawn
    在某些情况下,当您的服务意外停止时,可以自动重新启动它。
procd_set_param respawn \${respawn_threshold:-3600} \${respawn_timeout:-5} ${respawn_retry:-5}
  • pidfile
    存储pid的文件
procd_set_param pidfile $PIDFILE
  • env vars
    传递环境变量到你的进程
procd_set_param env A_VAR=avalue
  • ulimit

如果您需要为进程设置资源限制,可以使用以下方法:

procd_set_param limits core="unlimited"

要查看在OpenWrt设备上的系统范围内的ulimit设置,您可以运行以下命令:

$ ulimit -a
-f: file size (blocks)             unlimited
-t: cpu time (seconds)             unlimited
-d: data seg size (kb)             unlimited
-s: stack size (kb)                8192
-c: core file size (blocks)        0
-m: resident set size (kb)         unlimited
-l: locked memory (kb)             64
-p: processes                      475
-n: file descriptors               1024
-v: address space (kb)             unlimited
-w: locks                          unlimited
-e: scheduling priority            0
-r: real-time priority             0
  • user

修改运行服务的用户,请使用下面的命令:

procd_set_param user nobody 

默认情况下,OpenWrt只有一个’root’用户或’nobody’作为进程所有者。
您可以按照通常的Linux方式添加用户,请参阅在OpenWrt中创建非特权用户。如果您正在创建一个实际的软件包,您可以使用buildpackage定义,在软件包安装时让OpenWrt生成用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_690779.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python定义未知变量的方法及注意事项

Python定义未知变量的方法及注意事项 在Python编程中,我们经常需要定义变量来存储数据,但有时候我们需要先创建一个变量,但不想立即给它赋值,或者我们想定义一个未知变量。本文将介绍Python中定义未知变量的方法及注意事项。 什…

chatgpt赋能python:Python安装和打开教程

Python安装和打开教程 Python作为一种高效、灵活、易学易用的编程语言,越来越受到广大程序员的青睐,越来越多的人想要学习Python。在学习Python之前,首先要进行Python的安装和打开。那么,本篇文章将为您介绍如何安装和打开Python…

READ-自动驾驶大场景神经渲染

这是一个针对自动驾驶场景的神经渲染方案,提出了一种大规模神经渲染方法来合成自动驾驶场景(READ),这使得通过各种采样方案在PC上合成大规模驾驶场景成为可能。 疑问:文中提到基于nerf的方法和神经渲染方法&#xff0…

BOOST 恒压控制驱动芯片,外围电路简单

应用说明 Hi8000 是一款外围电路简单的 BOOST 升压恒压控制驱动芯片,适用于 2.7-40V 输入电压范围的升压恒压电源应用领域,启动电压可以低至 2.5V,可以广泛应用 于太阳能、便携式数码产品,锂电升压应用等供电领域。 应用领域 移…

第六十七天学习记录:对陈正冲编著《C 语言深度解剖》中关于变量命名规则的学习

最近开始在阅读陈正冲编著的《C 语言深度解剖》,还没读到十分之一就感觉收获颇多。其中印象比较深刻的是其中的变量的命名规则。 里面提到的不允许使用拼音正是我有时候会犯的错。 因为在以往的工作中,偶尔会遇到时间紧迫的情况。 而对于新增加的变量不知…

无条件抽奖和条件抽奖(互动功能发起端JS-SDK)

无条件抽奖功能概述 允许开始前对抽奖进行奖品、中奖人数、中奖人员等设置,完成设置后可以开始抽奖。 本功能只支持讲师、嘉宾、助教、管理员这四种角色进行抽奖的发起和停止。支持自定义设置中奖用户信息采集字段。支持设置预设中奖用户。支持设置定时开奖可查看…

java设计模式(十六)命令模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 命令模式(Command Pattern) 又叫动作模式或事务模式。指的是将一个请求封装成一个对象,使发出请求的责任和执行请求的责任分割开,然后可以使用不同的请求把客户端参数化&a…

【SpinalHDL快速入门】4.6、复合类型之Vec

文章目录 1.1、描述1.2、声明1.2.1、实例 1.3、运算符1.3.1、比较(Comparison)1.3.2、类型转换(Type cast)1.3.3、杂项(Misc)1.3.4、Lib辅助函数(Lib helper functions) 1.1、描述 …

2023/6/6总结

CSS 如果想要实现背景颜色渐变效果&#xff1a; left是从左边开始&#xff0c;如果想要对角线比如&#xff0c;左上角就是left top&#xff0c;渐变效果始终是沿着一条线来实现的。 下面是跟着视频教学用flex布局写的一个移动端网页&#xff1a; html代码&#xff1a; <!…

Day_42哈希表

目录 一. 关于哈希表 二. 如何实现哈希表 1. 散列函数 2. 散列表 3. 散列函数的构造方法 4. 处理冲突的方法 三. 代码实现 1. 构造函数构造哈希表 2. 哈希表的查找 四. 代码展示 五. 数据测试​编辑 六. 总结 一. 关于哈希表 在前面介绍的线性表的查找中,记录在表中的位置…

kali 2023.2安装、换源、更新、SSH

kali2023版本已经更新了&#xff0c;为了体验新版&#xff0c;下载试用了一下。记录初始的安装过程&#xff0c;以备复习用&#xff0c;不足之处欢迎批评指正。 一、下载 1、官网下载&#xff0c;地址&#xff1a;https://www.kali.org/&#xff0c;因为我准备在VM虚拟机中使用…

二叉搜索树(Binary Seach Tree)模拟实现

目录 二叉搜索树的性质 二叉搜索树的实现 结点类 接口类(BSTree) 二叉搜索树的插入(insert) 二叉搜索树的查找(find) 二叉搜索树删除(erase) 第二种、删除的结点右子树为空 第三种、删除的结点左子树为空 第四种、删除的结点左右都不为空 实现 二叉搜索树模拟实现代…

【算法】手写题

文章目录 画一个三角形实现三栏布局通过position和margin通过float和margin通过flex实现 变量提升题实现边框0.5px深拷贝快速排序 画一个三角形 .box1 {width: 0;height: 0;border: 10px solid;border-color: red transparent transparent transparent;}实现三栏布局 三栏布局…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…

呈现视觉妙技:使用Python将MP4视频转化为迷人的GIF图像

前言 GIF图片对于我来说是一个很好的展示方式&#xff0c;GIF 图片能够展示动态的图像效果&#xff0c;对于展示计算机视觉算法或结果非常有用。例如&#xff0c;我可以使用 GIF 图片来展示运动跟踪、姿势识别、图像分割、目标检测等任务的结果&#xff0c;以更生动和直观的方…

20230606夏新(Amoi)的4K显示器D320B2000的亮点检测

20230606夏新&#xff08;Amoi&#xff09;的4K显示器D320B2000的亮点检测 2023/6/7 0:14 https://item.jd.com/63690000655.html 夏新&#xff08;Amoi&#xff09;电脑显示器高清家用办公电竞吃鸡游戏液晶监控直播大屏便携显示屏幕 32英寸【直面 4k/144hz双模式 全面屏】黑 …

总结891

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲1遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化1讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff…

Day_40关于图的总结

一. 实际问题的抽象与建模 如果我们需要研究一个实际问题&#xff0c;首先第一步就是对这个实际问题进行抽象&#xff0c;抽象是从众多的事物中抽取出共同的、本质性的特征&#xff0c;而舍弃其非本质的特征的过程。具体地说&#xff0c;抽象就是人们在实践的基础上&#xff0c…

chatgpt赋能python:Python如何自动换行

Python如何自动换行 在Python编程中&#xff0c;有时候我们需要输出很长的文本或字符串&#xff0c;这时候就需要自动换行的功能。本文将介绍Python中实现自动换行的几种方法。 方法一&#xff1a;使用字符拼接 在Python中&#xff0c;我们可以使用"“来拼接字符串。如…

Internal error. Please report to https://jb.gg/ide/critical-startup-errors

大佬的解决方式&#xff1a;PyCharm 2023 启动报错的处理 部分同学&#xff0c;发现在安装 PyCharm 2023.1.2 以及 PyCharm 2023.2 的抢先体验版之后&#xff0c;运行的时候愣是直接弹出了类似上面的报错。 反正&#xff0c;别慌&#xff01; 是的&#xff0c;他们有 bug。 …