Openwrt 包管理系统介绍

Openwrt 包管理系统介绍

  • 1. OpenWrt简介
    • 1.1 主要特点
    • 1.2 开源嵌入式操作系统
      • 1.2.1 嵌入式系统概念
      • 1.2.2 嵌入式系统分类
      • 1.2.3 嵌入式系统——安卓
      • 1.2.4 嵌入式系统的对比
  • 2 OpenWrt包管理系统
    • 2.1 工作原理
    • 2.2 OPKG命令
      • 2.2.1 命令用法
      • 2.2.2 软件包的管理
      • 2.2.3 查询信息
      • 2.2.4 选项
    • 2.3 OPKG配置
      • 2.3.1 调整软件仓库地址
      • 2.3.2 调整安装目录
      • 2.3.3 代理设置
    • 2.4 OPKG包结构

1. OpenWrt简介

OpenWrt是一个嵌入式设备的Linux发行版,以GPL许可协议发行,拥有强大的网络组件和扩展性,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中,可以非常容易地从零开始构建出全功能的智能路由或服务器设备。

OpenWrt项目始于2004年1月,其第一个版本采用了LinkSys的源码。在LinkSys的代码收费后,2005年改为采用正式发布的Linux内核(2.4.30)来集成,并将OpenWrt完全模块化,不断推出补丁和网络驱动。

OpenWrt的主要特点在于其高扩展性,并且文件系统可写,开发者无需在每一次修改后完全重新编译,只要编译自己的软件包即可,这样就加快了开发的进度,令它更像一个小型的Linux 电脑系统,到目前为止已经提供了100多个已编译好的软件,而且数量还在不断增加。另外OpenWrt提供了SDK,每个运行软件均能够以SDK来进行编译,以软件包形式进行安装和卸载。

1.1 主要特点

  • 代码里不含第三方开源包,只包含开源包地址链接。
  • 编译时自动下载源代码、打补丁来满足指定平台要求,并编译。还可以修改Makefile来下载最新的软件包。
  • 使用LuCI作为最终用户管理界面。LuCI以Apache许可协议发布Web管理功能代码。
  • UCI通用配置管理方法。
  • 通过脚本来调用iptables来实现防火墙功能,配置保存在UCI文件中。
  • 开放和可扩展的OPKG格式安装升级包。

1.2 开源嵌入式操作系统

1.2.1 嵌入式系统概念

嵌入式系统,是指嵌入到硬件系统内部,为特定应用功能而设计的专用软件系统。与个 人计算机的通用操作系统不同,嵌入式系统通常只针对特殊的用途。因此可以对它进行优化, 并裁剪到最小。现在通用的硬件系统发展非常迅速,因此出现了在通用硬件系统上的嵌入式操作系统。目前在嵌入式领域广泛使用的操作系统有:Linux、Windows Embedded和VxWorks 等。

1.2.2 嵌入式系统分类

根据用途,操作系统又可以分为:

  • 针对防火墙的操作系统:IPFire;
  • 针对智能路由器领域的嵌入式操作系统:Tomato、OpenWrt等;
  • 针对个人桌面领域操作系统:Ubuntu、Fedora 等;
  • 针对智能终端如手机:Android 、Firefox OS等。

它们均是基于 Linux 内核的操作系统。

1.2.3 嵌入式系统——安卓

安卓系统和我们生活紧密联系,也为大家所熟知,下面介绍下安卓系统,用于与Openwrt进行对比:

  1. Android 是谷歌研发的一款智能终端操作系统,是一种基于 Linux 的开放源代码的操 作系统,主要使用于移动设备,如智能手机、平板计算机、智能电视等。它由谷歌公司和开放手机联盟领导开发。
  2. Android 操作系统最初由安迪·鲁宾开发,最初目的是用于数码相机的操作系统。
  3. 2005年8月谷歌全资收购了Android 操作系统。
  4. 2007年11月,谷歌与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟,共同研发改良Android 系统。随后谷歌以Apache开源许可协议的授权方式发布了Android的源代码,Android以 JAVA 层封装了系统层提供给应用开发者统一的API接口。
  5. 第一部 Android 智能手机发布于 2008年10月。
  6. 目前,Android已逐渐扩展到平板计算机及其他领域,如电视、智能手表、数码相机和游戏机等。
  7. 2015年,Android以85%的市场占有率占据移动操作系统市场之首。
  8. Android 操作系统已经演化为一个移动设备开发平台,其软件层次大体上分为 4 层, 即操作系统内核、中间层、应用程序框架层和应用程序。应用程序框架层为应用程序开发者提供了功能强大的 API,包括图形显示的各种组件,如视图、列表、文本框、按钮以及嵌入式的Web浏览器等。
AndroidOpenWrt
内核Linux 内核Linux 内核
许可协议Apache2.0GNU License
使用场景面向终端用户,手持设备。用户接口采用JAVA 提供图形用户界面GUI服务器、家庭路由器等,用户接口默认为 UCI 命令行提供,也支持通过 Web 方式来管理
开发主导模式由谷歌公司主导开发由 OpenWrt.org 社区主导,社区由个人组成,更开放

1.2.4 嵌入式系统的对比

下表为开源路由器各种发行版本的对比:
在这里插入图片描述

2 OpenWrt包管理系统

OPKG(Open/OpenWrt Package)是一个基于IPKG的轻量快速的软件包管理系统,可以称为IPKG的变种或克隆,目前已成为开源嵌入式系统领域的系统标准。OPKG常用于路由、交换机等嵌入式设备中,用来管理软件包的下载、安装、升级、卸载和查询等,并处理软件包的依赖关系。功能和桌面Linux操作系统Ubuntu中的apt-get、Redhat中的yum类似。

OPKG 是一个针对根文件系统全功能的软件包管理器,用来从本地软件仓库或互联网软件仓库上下载并安装 OpenWrt 软件包。它不仅仅是将软件安装到一个单独的路径(如:/opt),而是根文件系统上。还可以用于安装内核模块和驱动等。OPKG 有时被称为 Entware ,但这主要是针对为嵌入式设备准备的 Entware 仓库。OPKG在安装时会自动解决安装软件时的包依赖关系,如果遇见错误,就中止安装。如果丢失第三方包的依赖关系,源码包依然可用的话,为了忽略依赖关系的错误可以使用 –force-depends 选项。

2.1 工作原理

当执行“opkg update”命令进行软件列表的更新时,OPKG首先会读取配置文件/ etc/opkg.conf,这个文件保存了OPKG的全局配置信息。
在这里插入图片描述
紧接着,OPKG会根据配置地址位置下载软件包列表文件Packages.gz到/var/opkg-list目录下,这个文件是软件仓库中所有软件列表及其依赖关系的清单,是使用gzip压缩的文件,这样在网络传输时所占用网络流量比较小。其后任何安装命令均需首先读取这两个文件。

软件安装之后的信息会保存在目录/usr/lib/opkg/下面,这里就相当于Windows操作系统中的注册表。它包含状态文件,OPKG通过访问这个状态文件确定该软件是否已安装、安装的版本,以及依赖关系是否满足等,从而可以确定安装软件的版本、文件路径等信息。
在这里插入图片描述
在这里插入图片描述
OPKG命令执行会读取以下3部分的信息:配置文件、已安装软件包信息和软件仓库的软件包信息。

  • 配置文件默认位置为/etc/opkg.conf。
  • 已安装软件包状态信息保存在/usr/lib/opkg目录下。
  • 软件仓库的软件包信息保存在/var/opkg-lists目录下。

2.2 OPKG命令

2.2.1 命令用法

OPKG必须带有一个子命令,如果不带有子命令,将输出OPKG的详细使用提示信息。首先是提示必须有一个子命令参数,然后是命令格式提示信息,最后是各个子命令和选项信息含义描述。

/ # opkg
opkg must have one sub-command argument
usage: opkg [options...] sub-command [arguments...]
where sub-command is one of:

Package Manipulation:
        update                  Update list of available packages
        upgrade <pkgs>          Upgrade packages
        install <pkgs>          Install package(s)
        configure <pkgs>        Configure unpacked package(s)
        remove <pkgs|regexp>    Remove package(s)
  
Informational Commands:
        list                    List available packages
        list-installed          List installed packages
        list-upgradable         List installed and upgradable packages
        files <pkg>             List files belonging to <pkg>
        search <file|regexp>    List package providing <file>
        find <regexp>           List packages whose name or description matches <regexp>
        info [pkg|regexp]       Display all info for <pkg>
        status [pkg|regexp]     Display all status for <pkg>
        download <pkg>          Download <pkg> to current directory
        depends [-A] [pkgname|pat]+

Options:
        -A                      Query all packages not just those installed
        -d <dest_name>          Use <dest_name> as the the root directory for
        --dest <dest_name>      package installation, removal, upgrading.
                                <dest_name> should be a defined dest name from
                                the configuration file, (but can also be a
                                directory name in a pinch).
        -o <dir>                Use <dir> as the root directory for
        --offline-root <dir>    offline installation of packages.
        --add-arch <arch>:<prio>        Register architecture with given priority
        --add-dest <name>:<path>        Register destination with given path
Force Options:
        --force-depends         Install/remove despite failed dependencies
         --force-reinstall       Reinstall package(s)
        --force-overwrite       Overwrite files from other package(s)
        --force-downgrade       Allow opkg to downgrade packages

 regexp could be something like 'pkgname*' '*file*' or similar
 e.g. opkg info 'libstd*' or opkg search '*libop*' or opkg remove 'libncur*'

OPKG的功能主要分两类,一种是软件包的管理命令,另外一种是软件包的查询命令。另外还有很多可以修饰的选项。

2.2.2 软件包的管理

软件包的管理是OPKG最重要的功能,主要包含更新软件包列表、安装、卸载和升级等功能。

  1. opkg update
    该命令用于更新可以安装的软件包列表。该命令不需要参数,执行时从服务器地址下载软件包列表文件并存储在/var/opkg-lists/目录下。OPKG在安装或升级时需要读取这个文件,这个文件代表当前仓库中所有可用的软件包。也可以删除该文件来释放存储空间,在安装软件前需要重新获取这个文件。

  2. opkg install
    该命令用于安装软件包,需要一个参数,传递一个软件包名称。如果软件包之间有依赖关系,会自动下载所有被依赖的软件包,并依次将所有被依赖的软件包安装上。如下图所示用于安装smsdemo软件包。
    在这里插入图片描述
    或如下所示代码用于安装file软件包,其所依赖的软件包libmagic会自动安装上:

/# opkg install file 
Installing file (5.11-1) to root... Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/ x86/generic/packages/file_5.11-1_x86.ipk. 
Installing libmagic (5.11-1) to root... 
Downloading http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packages/libmagic _5.11-1_x86.ipk. 
Configuring libmagic. 
Configuring file.
  1. opkg remove
    该命令用于卸载软件包,需要一个参数,传递一个软件包名称。需要注意的是,在安装时自动安装的软件包并不会删除,需要自己手动删除,或者在卸载软件包的同时增加(–autoremove)参数将不需要的安装包也删除。如下所示用于卸载smsdemo软件包:
    在这里插入图片描述
    如下所示代码用于删除file软件包及不再使用的依赖包。
    /# opkg remove file --autoremove
    Removing package file from root…
    libmagic was autoinstalled and is now orphaned, removing.
    Removing package libmagic from root…
  2. opkg upgrade
    该命令用于升级软件包。如果软件包没有安装,该命令执行之后和“opkg install”效果相同。如果升级多个软件包,以空格分隔列在命令之后即可。例如使用opkg upgrade ip wget来升级两个软件包。
    对大多数用户来说,不推荐升级软件包。OpenWrt发布后再进行升级大多数情况下是不可能的,这是因为OpenWrt发布之后一般不再更新,除非主干的快照被编译机器人(buildbot)自动更新。如果内核升级了,可能带来升级风险,因为内核可能和原始安装的应用软件不兼容。因此一般只升级应用,即非内核软件包。

2.2.3 查询信息

OPKG查询命令可以在软件仓库中查询,也可以在运行的系统中查询。OPKG提供了软件包的双向查询功能:正向查询,即从软件包来查询所包含的文件列表;也可以反向查询,从系统中所安装的文件查询所属的软件包。

  1. opkg list
    该命令用于列出所有可使用的软件包,列出内容格式为:软件包名称–版本–描述。描述内容是可以有换行的。如果使用grep命令来查找软件包则需注意,grep是单行匹配,因此使用grep查找的结果并不准确。
    在这里插入图片描述
  2. opkg list-installed
    该命令用于列出系统中已经安装的软件包。
  3. opkg list-changed-conffiles
    该命令用于列出用户修改过的配置文件。
    在这里插入图片描述
  4. opkg files
    该命令用于列出属于这个软件包()中的所有文件,这个软件包必须已经安装。下图示例查看smsdemo软件包所包含文件列表:
    在这里插入图片描述
    如下所示代码用于查看ip软件包所包含的文件列表。
#opkg files ip 
Package ip (3.3.0-1) is installed on root and has the following files: 
/usr/sbin/ip 
/etc/iproute2/rt_tables
  • opkg search
    该命令用于列出提供的软件包,注意:需要传递文件的绝对路径。
    在这里插入图片描述

  • opkg find
    该命令用于列出软件包名称和匹配的软件包。是一个正则表达式,可以精确匹配,也可以使用星号来模糊匹配,例如使用“net”或者“ net*”,均可以匹配NetCat。
    在这里插入图片描述

  • opkg info [pkg]
    该命令用于显示已安装[pkg]软件包的信息,包含软件包名称、版本、所依赖的软件包名称、安装状态和安装时间等。如果没有指定参数则输出所有已安装软件包的信息。“opkg status”和这个命令功能完全相同。
    在这里插入图片描述

  • opkg download
    该命令用于将软件包下载到当前目录。

  • opkg print-architecture
    该命令用于列出安装包的架构。
    在这里插入图片描述

  • opkg whatdepends [-A] [pkg]
    该命令用于针对已安装的软件包,输出依赖这个软件包的软件包。
    在这里插入图片描述

2.2.4 选项

OPKG有很多选项可以使用,这里只列出几个最常用的选项。

  • -A:查询所有的软件包,包含未安装的软件包。
  • -d <dest_name>:使用<dest_name>作为软件包的安装根目录。<dest_name>是配置文件中定义的目录名称。
  • -f <conf_file>:指定使用<conf_file>作为opkg的配置文件。如不指定,默认配置文件是/etc/opkg.conf。
  • –nodeps:不按照依赖来安装,只安装软件包自己。这可能会导致缺少依赖文件,导致程序不能执行。
  • –autoremove:卸载软件包时自动卸载不再使用的软件包(在安装时依赖会自动安装上)。
  • –force-reinstall:强制重新安装软件包,在软件包版本未修改时不会再次安装,增加该选项来强制重新安装。

2.3 OPKG配置

OPKG需要一个配置文件来保存全局配置,例如软件从哪里下载、安装到哪里等。

2.3.1 调整软件仓库地址

OPKG配置文件默认是/etc/opkg.conf。内容参考如下:

src/gz attitude_adjustment http://192.168.1.106:8080/openwrt 
dest root /
dest ram /tmp 
lists_dir ext /var/opkg-lists 
option overlay_root /overlay 

OPKG可以使用多个仓库,每一个仓库需要一个唯一标识符,即使用它们的逻辑名字。例如:

src/gz attitude_adjustment http://downloads.openwrt.org/attitude_adjustment/12.09/x86/generic/packa ges/ 
src/gz local http://192.168.1.106:8080/openwrt

2.3.2 调整安装目录

OPKG的一个非常有用的特性,是有能力指定任何安装包的安装目录。安装目录在配置文件/etc/opkg.conf中定义。配置文件中目的地址格式是以dest开头,紧跟着目的地址的名称,最后是目录路径,必须从根目录开始。

dest root / 
dest ram /tmp 
dest usb /opt 

安装目录定义之后,目的地址名称就可以在安装命令中引用了。安装时目的地址名称只能引用在/etc/opkg.conf中定义的地址名称,例如“-d ram”表示软件将安装到临时目录/tmp下。安装命令类似如下格式:

opkg install <pkg> -d <目的地址名称>

2.3.3 代理设置

OPKG通过下载软件包来安装,如果你通过HTTP代理服务器来上网,那就不能直接连接到服务器地址,这时就需要设置代理服务器地址。在/etc/opkg.conf中加入以下设置:

option http_proxy http://proxy.example.org:3128/ 

如果代理服务器需要认证,则需要增加以下认证信息:option proxy_username xxxxxx option proxy_password xxxxxx 如果使用busybox的wget命令,这个工具不支持认证功能,下载时将认证失败。可以改为在URL中传递用户名和密码:

option http_proxy http://username:password@proxy.example.org:3128/

2.4 OPKG包结构

OPKG安装包(ipk文件)是一个gzip压缩文件,可以用file命令来查看文件格式描述。其实,ipk文件就是一个“tar.gz”文件,我们可以用tar命令来解压缩并查看文件内容,其内容包含两个压缩文件和一个版本文件。我们以smsdemo软件包为例来说明安装包格式,首先使用tar命令来解压缩smsdemo的安装包。命令如下:
在这里插入图片描述
解压缩完成后生成3个文件,其中debian-binary是一个纯文本文件,包含字符串“2.0”,表示格式为debian2.0格式。
在这里插入图片描述
data.tar.gz包含“/usr/bin/smsdemo”文件,在安装时复制到安装目录下。
在这里插入图片描述
control.tar.gz解压缩后发现仅包含文件“control”、“postinst”、“prerm”。

在这里插入图片描述
control文件内容包含软件包名称、版本、依赖关系、所属分类、状态、优先级、平台架构和软件描述等。

在这里插入图片描述
控制部分所有文件的含义,如下表:

文件含义
control控制文件,包含软件包名称、版本、依赖关系和所属分类等信息
conffiles配置文件,内容包含该软件的配置文件列表,一个文件占一行
preinst安装文件之前执行脚本
postinst安装文件之后执行脚本,例如安装之后设置用户及启动程序等
prerm卸载之前执行的脚本,例如卸载之前首先结束运行的程序进程
postrm卸载之后执行的脚本

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

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

相关文章

设计测试用例的具体方法总结

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️白马沉河共歃誓&#xff0c;怒涛没城亦不悔 ☁️基于需求进行测试用例的设计 基…

vue3 for循环创建的多个e-form 添加校验

v-for 创建 ref <el-form :model"item" :rules"state.rules" :ref"el > getRiskSpreadRef(el, index)" ></el-form>// 定义ref list const riskSpreadRefList ref<HTMLElement[]>([]);// ref存到数组 const getRiskSpread…

初始linux:文件操作

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 linux的理念 一、echo echo "字符串" 二、输出重定向 > > [文件] echo "字符串" > [文件] echo "字符串" > > [文件] 制作大文件 三、< 输入重定向与ca…

【开源】基于JAVA的森林火灾预警系统

项目编号&#xff1a; S 019 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S019&#xff0c;文末获取源码。} 项目编号&#xff1a;S019&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 系统基础模块2.3 烟…

QT已有项目导入工程时注意事项

文章目录 从qt其他版本上开发的工程导入另一qt版本时 从qt其他版本上开发的工程导入另一qt版本时 这里以之前在qt5.12.2上开发的项目为例&#xff0c;现在到在qt6.5.3上运行。 不能直接导入IDE上&#xff0c;否则会报各种莫名奇妙的错误。 首先要把扩展名位.pro.user文件 删掉…

面试题:说说什么是本地缓存、分布式缓存以及多级缓存,它们各自的优缺点?

文章目录 前言一、缓存的概念&#xff08;什么是缓存&#xff09;二、为什么要用缓存&#xff08;为什么要用redis作为缓存&#xff09;三、缓存的分类有哪些1、本地缓存2、分布式缓存3、多级缓存 总结 前言 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xf…

kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的&#xff0c;换句话说删除以后不会保留任何数据。 所以对于mysql这种有状态的应用&#xff0c;必须使用持久化存储作为支撑&#xff0c;才能部署成有状态的stateful. 最简单的方法就是使用nfs作为网络存储&#xff0c;因为nfs存储很容易被…

Leetcode—58.最后一个单词的长度【简单】

2023每日刷题&#xff08;四十&#xff09; Leetcode—58.最后一个单词的长度 实现代码 int lengthOfLastWord(char* s) {int len strlen(s);int left 0, right 0;if(len 1) {return 1;}while(right < len) {if(right 1 < len) {if(s[right] && s[righ…

激活函数与非线性化:探索神经网络中的关键元素

随着人工智能领域的迅猛发展&#xff0c;神经网络成为实现各种复杂任务的有力工具。其中&#xff0c;激活函数及其非线性化特性扮演着至关重要的角色。本文将深入探讨激活函数的基本概念、作用原理以及常见的几种激活函数&#xff0c;并介绍它们在神经网络中发挥的重要作用。 …

Odoo:行业领先的免费开源生产制造管理系统

产品生命周期管理 用 Odoo 产品数据管理解决方案加速产品开发 研究、开发和设计新产品或者重新设计现有产品是所有制造企业的活力之源&#xff0c;但很多企业的设计部门和工程部门却完全脱离 ERP 系统。这导致工程师需要耗费大量时间来回答企业中其他部门就产品状态、修改级别…

【小技巧】复制一个模块到你的工程(学习阶段很实用)

问题描述&#xff1a; 当我们学习Springboot时&#xff0c;需要创建大量的模块&#xff0c;而这些模块的许多代码都是重复的&#xff0c;只有模块名等相关的信息不一样&#xff0c;现在就教你如何快速创建一个模块。 应用场景&#xff1a; ①进入项目文件夹&#xff1a; ②复…

Java实现—数据结构 1.初识集合框架

一、什么是集合框架 Java集合框架&#xff0c;又被称为容器&#xff0c;是定义在java.util包下的一组接口interfaces和其实现类classes 其主要表现为将多个元素element置于一个单元中&#xff0c; 集合框架是由若干个类组成的&#xff0c;每个类的背后就是一种数据结构&…

webpack 打包优化

在vue.config.js中配置 下载 uglifyjs-webpack-plugin 包 const { defineConfig } require("vue/cli-service"); var path require("path");module.exports defineConfig({transpileDependencies: true,filenameHashing: false, // 去除Vue打包后.cs…

window获取密码工具

工具getpass.exe 运行输出密码到5.txt 工具gethashes.exe 运行之后输入到6.txt,会得到一个$local 再运行gethashes.exe $local 可以看到加密的账户密码&#xff0c;用工具进行解密就可以得到密码 工具pwdump7 还有其他的mimikatz&#xff0c;msf工具都可以获取。

canvas扩展001:利用fabric绘制图形,可以平移,旋转,放缩

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

frp V0.52.3 搭建

下载 https://github.com/fatedier/frp/releases/ 此版本暂时没有windows的&#xff0c;想在windows使用请下载v0.52.2 简易搭建 frps.toml的配置文件&#xff0c;以下12000、8500需要在云服务器中的防火墙中开放tcp # bindPort为frps和frpc通信的端口&#xff0c;需要在防…

Git控制指令

git status查看当前本地分支的修改状态 git diff 文件路径 查看具体文件的修改内容 git log打印用户信息 git remote -v查看远程地址 git checkout -- *还原被删除的文件 git rm -r --force .删除本地所有文件 git commit -m "Remove all files from repositor…

基于C#实现外排序

一、N 路归并排序 1.1、概序 我们知道算法中有一种叫做分治思想&#xff0c;一个大问题我们可以采取分而治之&#xff0c;各个突破&#xff0c;当子问题解决了&#xff0c;大问题也就 KO 了&#xff0c;还有一点我们知道内排序的归并排序是采用二路归并的&#xff0c;因为分治…

crontab 定时检测 Tomcat 状态脚本实现及注意事项

背景 Jenkins 所在的 Tomcat 总是莫名挂掉&#xff0c;虽然任务配置了 NOKILLME 参数&#xff0c;而且并不是总是发生在编译完成后才挂的。怀疑是机器资源不足导致的&#xff0c;没有依据。最简单的办法是创建一个定时任务&#xff0c;检测 Tomcat 状态&#xff0c;不见了就拉…

京东家用电器商品电子说明书在哪里能找到怎么查看产品电子说明书?草柴返利APP如何查询领取京东优惠券拿京东购物返利?

京东商品电子说明书是一种便捷、高效的说明工具&#xff0c;为消费者了解和使用商品提供了重要帮助。京东商品电子说明书是一种以电子文档、图文、视频的形式提供的商品使用说明书。它通常由商家上传至京东平台&#xff0c;以供消费者在购买商品后下载查看。与传统的纸质说明书…