Linux基础知识与实操-篇八:定期任务执行与进程任务处理

news2024/11/25 6:56:36

文章目录

  • 例行工作安排
    • 单一工作安排
    • 循环执行的任务
    • 注意事项
    • 唤醒停机期间的任务
  • 进程任务处理
    • 任务管理`job control`
      • 后台执行
    • 进程管理
    • 进程的执行顺序
    • 系统资源查看
    • 特殊文件与进程
  • 最后

例行工作安排

类似于定时任务、系统安排的任务提醒等

一般在任务中,有两个类型:

  • 例行性:每个一定的周期就需要执行的事项
    crontab 指令 处理循环执行的指令
  • 突发性:做完以后就没有了
    at 指令 处理仅执行一次就结束的指令

单一工作安排

要使用单一工作安排,就需要Linux系统上面必须有负责这个安排的服务,即atd 服务:
下面是我本机的 atd服务情况:
image

如果不是这个状态,就使用下面的命令处理:

#重新启动atd服务
systemctl restart atd

# 服务开机自启
systemctl enable atd

# 查看atd目前状态
systemctl status atd

有了该服务的支持,就可以实现 单次的工作安排at 命令了:at 指令产生需要运行的工作,并将这个工作以文本文件的形式写入/var/spool/at/ 目录内,该工作便能等待atd 这个服务的取用与执行了

处于安全考虑,由 /etc/at.allow/etc/at.denv 这两个文件来限制at 的使用,在这两个文件的限制下,at 的执行流程如下:
image

/etc/at.allow 文件的管理较为严格,/etc/at.deny较为松散
一般系统都是保留空的/etc/at.deny文件,即允许所有人使用at 指令。

at [-mldv] TIME 
at -c 工作号码

-m  当at工作完成后,即使没有输出信息,也以 email通知使用者,该工作已经完成
-l  相当于atq,列出目前系统上所有该用户的at安排
-d  相当于atrm,可以取消一个在at中的安排
-v  可以使用较为明显的时间格式列出任务列表
-c  可以列出后面接的该选项工作的实际指令内容

TIME: 时间格式, 这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
HH:MM 		ex> 04:00
在今日的 HH:MM 时刻进行,若该时刻已超过, 则明天的 HH:MM 进行此工作。

HH:MM YYYY-MM-DD 		ex> 04:00 2015-07-30
强制规定在某年某月的某一天的特殊时刻进行该工作!

HH:MM[am|pm] [Month] [Date] 		ex> 04pm July 30
也是一样, 强制在某年某月某日的某时刻进行!

HH:MM[am|pm] + number [minutes|hours|days|weeks]
		ex> now + 5 minutes ex> 04pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。

image

此外,使用at安排的工作,系统会将该选项at工作独立出bash环境,直接交给系统的atd 程序接管,因此当下达了at 的工作之后就可以立即脱机了,剩下的工作就完全交给Linux管理即可。

如果输入了错误的指令,可以通过atq 查看安排,并通过 atrm 进行移除

# 查看项目安排
atq
# 移除项目
atrm (jobnumber)

循环执行的任务

at 执行的任务限制类似,也需要下面两个文件限制使用者账号:
image

当用户使用功能contab 建立工作安排后,该项工作就被记录到/var/spool/cron中了,并且是以 账号 来作为判别的依据。

所以如果怀疑 系统中被植入了木马,就可以考虑查看var/log/cron 这个文件中是否有木马程序在执行

crontab [-u username] [-ll-el-r]

-u  只有root用户才可以执行这个任务,即帮助其他使用者建立/移除 crontab 工作安排
-e  编辑 crotab的工作内容
-l  查询crontab的工作内容
-r  移除所有的crontab 的工作内容,如果要仅仅移除一项,就可以使用-e去编辑

每项工作都有六个字段,这六个字段的含义如下:
image

image

如果是系统的例行性人物,可以直接编辑/etc/crontab文件实现 设置定时任务,只要编辑完该文件,将这个修改保存,cron的设定就会自动执行(如果没有马上执行,那么就需要重新启动crond服务:systemctl restart crond)
image

crond服务读取配置文件的位置

一般是从如下三个地方读取配置文件:

  • /etc/crontab
  • /etc/cron.d/*
  • /var/spool/cron/*

如果需要自己开发新的软件,该软件要拥有自己的crontab定时指令时,就可以将 配置文件放置到 /etc/cron.d 目录下
image

注意事项

在使用 上面的命令安排 例行操作时,要注意以下几点:

  • 避免资源分配不均
    image
  • 取消不必要的输出
    可以将错误信息重定向到/dev/null
  • 安全检验
  • 周 和 日月 不可共存

唤醒停机期间的任务

anacron 命令可以实现 在指定时间该执行却没有执行的任务(意外断电而无法执行的任务)

anacron命令也是每个小时被crond执行一次,然后ancron 再去检测相关的 任务有没有被执行,如果 有超过期限的工作,就执行该 安排任务,执行完毕或无需执行任何任务时,anacron就停止了

anacron 其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的排程喔!同时anacron 会每个小时被主动执行一次
image

进程任务处理

第16章

任务管理job control

后台执行

如果只有一个bash环境,又想要同时进行多个工作,可以将某些工作直接放到后台执行,就是在命令的后面加上一个&
image

这样在后台执行的命令就不怕被ctrl+C 打断了

# 在编辑test.txt 文件时,使用Ctrl+Z 将当前任务挂到后台
[root@AliComputer shLearn]# vim test.txt

[1]+  Stopped                 vim test.txt
[root@AliComputer shLearn]# jobs -l
# 现实正在挂载在后台的程序
[1]+ 3654019 Stopped                 vim test.txt
[root@AliComputer shLearn]#

但是,这里要注意一点,& 的作用是将任务放到后台执行,表示放入这个终端的后台,如果 该终端退出了,那么该任务也就被强制终止了,如果要实现 退出终端,任务继续执行,就需要使用nohup 命令了,它可以实现让命令在 该用户脱机或注销系统后继续执行该命令

# 在终端 前台执行
nohup [指令与参数]

# 在终端 后台执行
nohup [指令与参数] &

除此之外,我们还可以将当前的工作暂停:比如当前正在使用vim编辑文件,如果要使用shell, 可以使用ctrl+Z实现暂时换出vim,回到shell环境。

如果要查看有多少个工作在后台,可以通过如下命令实现:

jobs [-lrs]

-l  列出job number 与指令串之外,同时列出PID的号码
-r  仅列出正在背景运行的任务
-s  仅列出正在背景中暂停的工作

在查找到在后台的工作后,就可以通过如下的命令实现将 后台的工作放到前台继续处理:

fg %jobNumber


%jobnumber  jobNumber 为工作号码,这里的% 必须要有

使用如下:

# 列出后台任务
[root@AliComputer shLearn]# jobs -l
[1]+ 3654019 Stopped                 vim test.txt
# 回到该任务,继续执行 1
[root@AliComputer shLearn]# fg %1
vim test.txt

[root@AliComputer shLearn]# jobs -l
[root@AliComputer shLearn]#

下面考考虑该如何管理后台的工作:kill

kill -signal %jobnumber

-l  列出目前kill可以使用的信号有哪些
signal  表示后面那个任务的 操作指示(在Linux开发 的信号中有详细讲解)
	-1  重新读取一次参数的配置文件,类似reload
	-2  由键盘输入 ctrl-C同样的动作
	-9  立刻强制删除一个工作
	-15  以正常的进程方式终止一个工作,与-9不一样

使用如下:
image

-9 是用在 强制删除一个不正常的工作时使用的,-15 是用在以正常步骤结束一个工作(kill 命令的默认值也是15)

进程管理

这里主要讲解 观察进程、管理基础相关的命令,并不涉及相关操作系统 API 等原理和操作使用。

ps :获取当前进程运行情况(这里仅列举常用的命令)

# 获取系统所有的进程参数
ps aux
# 观察所有系统数据
ps -lA
# 进查看自己的bash 相关进程
ps -l
# 查看进程树状态
ps axjf


-A  所有的process 均显示出来,与-e 效果相似
-a  不予terminal有关的进程
-u  有效使用者的进程
x   通常与a这个参数一起使用,可以列出完整信息
下面的选项是限制输出格式的
l  较长,较详细的列出PID信息
j  工作格式 jobs format
-f  更加完整的输出

image

列出的主要字段如下:

  • F :进程标志(process flags), 表明 该进程的总结权限
    • 4 :表示该进程的权限为root
    • 1 :表示该子进程仅进行 复制fork 却没有执行
  • S :表示进程状态
    • R : running,该进程在运行中
    • S : Sleep,该进程在睡眠中,可以被唤醒
    • D : 不可被唤醒的睡眠状态,一般是在等待 I/O 的状态
    • T : 停止状态,可能是在工作控制或 除错 的状态
    • Z : 僵尸进程,进程已经终止,但是无法被移除置内存外
  • UID/PID/PPID : 该进程的所有者/进程PID号码/进程父进程PID号码
  • C : CPU使用率
  • PRI/NI : P r i o r i t y / N i c e Priority/Nice Priority/Nice的缩写,表示此进程被CPU所执行的优先级,数值越小表示该进程越快被CPU执行
  • ADDR/SZ/WCHAN : 与内存有关,ADDR表示该进程在内存的哪个部分,running 的进程就显示-, /SZ 表示此进程使用的内存,/WCHAN 表示该进程使用功能在运行中,若在运行中,使用- 表示
  • TTY: 登入者的中断位置,若为 远程登录 则使用动态终端接口 pts/n
  • TIME : 调用CPU时间,即此进程实际花费的 CPU运行时间
  • CMD : command的缩写,创建此进程的指令

使用ps aux 展示的字段与上面的命令稍有不同,但区别不大:
image

上面的ps命令是静态观察进程执行情况,下面的top 就是动态的观察,可持续侦测进程的运行状况

top [-d 数字] | top [-bnp]

-d  后面可以接秒数,表示top命令更新的频率
-b  以批次的方式执行top,通常搭配数据重定向将结果输出到文件中
-n  与-b搭配,表示需要进行几次top的结果输出
-p  指定某个PID进行观察监测
在top执行过程中,可以使用如下的 按键指令
	? 显示在top中 可用的按键指令
	P  以CPU 使用资源排序
	M  以内存使用资源排序
	N  以PID排序
	T  由该程序使用的CPU时间累积值排序
	k  给于某个PID一个信号
	r  给予某个PID一个新的nice值
	q  离开top程序

image

其中第一行显示的信息如下:
image

第二行(Tasks…)表示:目前这个进程的总量与个别进程 处于什么状态

第三行(%Cpus…)表示:显示CPU的整体负载,每个项目可使用? 来查阅,特别注意wa项目,表示 I/O wait,一眼系统变慢就是由于 I/O 产生的问题比较大

第四行与第五行表示:目前的物理内存与虚拟内存的使用情况,swap要尽可能的小,如果swap很大,就表示系统的物理内存不足

第六行:当前在 top 程序中 输入指令时,限制转态的地方

下面就是 每个进程的详细信息了:
image

top 预设使用CPU使用率排序

pstree 可以表示进程之间的相关性

pstree [-A|U] [-up]

-A  各进程树之间的连接以ASCII字符连接,最常用
-U  各进程树之间的连接以 万国码 连接,但是在某些终端下可能会有错误
-P  列出每个process的PID
-u  同时列出每个process的所属账号关系

进程管理最常用的就是使用信号实现,常用的信号如下:kill -signal PID
image

killall指令可以实现发出SIGHUP 信号,终止整个服务,不仅仅是终止一个进程那么简单了

killall [-iIe] [command name]

-i  交互式操作
-e  exact,表示后面接的 command name要一致,但整个完整的指令不能超过15个字符
-l  指令名称,忽略大小写

进程的执行顺序

CPU 安排进程的执行是有一定的规则的,Linux赋予每个进程一个 优先执行序(priority,PRI),这个PRI值越低,表示优先级越高,这个值由Linux核心动态调整,用户无法直接调整,但是如果想要 执行进程的执行顺序,可以通过 Nice(Ni) 值进行调整, 有 P R I ( n e w ) = P R I ( o l d ) + n i c e PRI(new)=PRI(old)+nice PRI(new)=PRI(old)+nice , 虽然 nice值可以影响 PRI,但是最终的 PRI仍然要经过系统分析后决定,而且 为了方便调整 Nice值是有正负的,当nice值为负时,就表示要降低该进程的 PRI值,优先处理该进程,有如下注意点:
image

一般的调整方式如下:

  • 一开始执行程序就立即给予一个特定的nice值:nice

    nice [-n 数字] command
    
    -n  后面接一个数字,数字范围在 -20~19
    

    一般在执行有些不重要的进程时,就可以调大nice值,比如备份系统资源这样的工作

  • 调整某个已经存在的 PID 的nice值:renice

    renice [number] PID 
    
    PID  某个进程的ID(从 ps命令或其他进程观察程序中获取)
    

系统资源查看

free : 查看内存使用情况

free [-b|-k|-m|-g|-h] [-t] [-s N -c N]

-b  直接输出free时,显示的单位是 Kbytes,可使用 b,M,KB,G来显示,也可以让系统指定单位(-h)
-t  在输出的最终结果,显示物理内存与swap的总量
-s  可以让系统每几秒输出一次
-c  与-s异瞳处理,让free列出几次的意思

使用如下:
image

一般Swap最好不要被使用,最好不要超过 20 20% 20以上,超过了则说明物理内存不足了

uname : 查看系统与核心相关的信息

uname [-asrmpi]

-a  所有系统相关的信息,包括低下的数据都会被列出
-s  系统核心名称
-r  核心版本
-m  本系统的硬件名称
-p  CPU类型,与-m类型
-i  硬件平台

使用如下:
image

uptime : 观察系统启动时间与工作负载,就是top 命令最上面的哪一行
image

netstat : 追踪网络或socket文件:

netstat -[atunlp]

-a  将目前系统上面所以的联机、监听、socket数据都列出
-t  列出tcp网络封包的数据
-u  列出udp网络封包的数据
-n  不以服务的服务名称,以 端口号(port number) 来显示
-l  列出目前正在网络监听(listen)的服务
-p  列出该网络的服务进程PID

当前的udp服务如下:
image

各个字段的含义如下:
image

当前主机启动的服务:
image

dmesg : 分析核心产生的信息,比如系统开机时,系统会检测 系统的硬件,检测到的信息就在这里
image

vmstat : 检测系统资源变化

[root@study ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
[root@study ~]# vmstat [-fs] <==内存相关
[root@study ~]# vmstat [-S 单位] <==设定显示数据的单位
[root@study ~]# vmstat [-d] <==与磁盘有关
[root@study ~]# vmstat [-p 分区槽] <==与磁盘有关
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
-f : 开机到目前为止,系统复制 (fork) 的进程数;
-s : 将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位, 让显示的数据有单位。例如 K/M 取代 bytes 的容量;
-d :列出磁盘的读写总量统计表
-p :后面列出分区槽,可显示该分区槽的读写总量统计表

使用如下:
image

各个字段的含义如下:
image

查看系统所有磁盘的读写状态:
image

一般如果 I/O 部分特别忙碌,系统就会变的非常慢

特殊文件与进程

进程都是在内存当中!而内存当中的数据又都是写入到 /proc/* 这个目录下的,基本上,目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc 当中。 举例来说,我们开机所执行的第一支程序 systemd 他的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/*, 针对整个 Linux系统的相关参数:
image

fuser : 有文件或文件系统找出正在使用该文件的进程

fuser [-umv] [-k [i] [-signal] ] file/dir

-u  处理进程的PID之外,同时列出该进程的拥有者
-m  后面接文件名,该文件名会主动提到该文件的最顶层,对 umount不成功很有效
-v  列出每个文件与进程和指令的完整相关性
-k  找出使用该文件/目录的PID,并试图使用 SIGKILL 终止该进程
-i  必须与-k 配合使用,在删除PID之前会先询问使用者
-signal  指定信号量,预设为 SIGKILL(9)

使用如下:
image

lsof : 列出被进程所开启的文件名

lsof [-aUu] [+d]

-a  多项数据需要 同时成立 才可以显示出结果
-U  仅列出 socket文件类型
-u  接username,列出该使用者相关进程所开启的文件
+d  后面接目录,找出某个目录下已经被开启的文件

# 列出root用户的所有进程开启的socket文件,-a 选项就是用于连接多个不同的需求使用的
lsof -u root -a -U

# 列出root的bash程序所开启的文件
lsof -u root | grep bash

pidof: 找出某个正在执行的程序的PID

pidof [-sx] program_name

-s  列出一个PID而不列出所有的PID
-x  同时列出该 程序 可能的 PPID 那个进程的PID

# 列出 systememd 以及 resylogd 这两个程序的PID
pidof systemd rsyslogd

image

最后

一起提高,慢慢变强

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MR小区搜索(六)cell reselection

微信同步更新欢迎关注同名modem协议笔记 小区选择和小区重选都是idle态行为&#xff0c;小区重选无非是为了让UE驻留在信号状况最好的小区上&#xff0c;以便之后在connected mode获得更好的体验&#xff0c;小区重选的目标小区也要满足S准则&#xff0c;下面就来具体看下小区…

19c pdb克隆单机到rac,日志出现:WARNING报警处理

打开pdb后&#xff0c;警告日志出现 Violations: Type: 2, Count: 1 *************************************************************** WARNING: Pluggable Database PDB3 with pdb id - 3 is altered with errors or warnings. Please look into PDB_PLUG_IN_VIOLATIONS vie…

运算符-12-多学一招原码反码补码,隐式和强制转换,位运算

下面来解释这些东西是怎么来的 原码 例如&#xff1a; 最左边的叫做符号位&#xff0c;0 为正&#xff0c;1 为负&#xff0c;后面的才是具体的数值 在计算机中&#xff0c;一个 0 或者 1 所占的空间叫 bit 中文名叫比特位&#xff0c;八个 bit 就称为一个字节&#xff0c;字…

Java+Swing学生信息管理系统(含源码+论文+答辩PPT等)

该项目采用技术&#xff1a;JDBCAWTSwing集合面向对象编程等相关技术&#xff0c;项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 项目功能介绍&#xff1a; 系统管理&#xff1a;用户登录、退出、注册 学校管理&#xff1a;设置学生学校以及联系方式等信息 …

C语言——矩阵转置

矩阵转置的原理&#xff1a;行元素变成列元素&#xff0c;列元素变成行元素 例如&#xff1a; 矩阵转置代码 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<math.h>//矩阵转置 double** Matrix_T(double** arr) {if(arrNULL)e…

Linux服务器配置与管理(基于Centos7.2)任务目标(六)

文章目录一、实验目的&#xff1a;二、实验内容及基本要求&#xff1a;三、实训步骤一、实验目的&#xff1a; ●了解Shell脚本的概念和执行方法&#xff1b;能熟编写Shell脚本来管理系统 二、实验内容及基本要求&#xff1a; 1、使用脚本批量创建用户 2、使用脚本批量删除用…

【895. 最大频率栈】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。void push(int val) 将一个整数 val …

MySQL索引的底层数据结构原理剖析(二叉树、 红黑树、Hash、B-Tree、B+Tree)

一. 前言 1. 说明 我们平时所说的&#xff1a;聚集索引(主键索引)&#xff0c;次要索引&#xff0c;覆盖索引&#xff0c;复合索引&#xff0c;前缀索引&#xff0c;唯一索引在MySQL5.7和 8.0版本默认都是使用BTree索引&#xff0c;除此之外还有 Hash索引。至于MySQL5.7之前版…

Go-Excelize API源码阅读(三十八)——SetCellStyle

Go-Excelize API源码阅读&#xff08;三十八&#xff09;——SetCellStyle 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源…

智慧城市运营中心建设方案(SCOC)智慧城市的心脏

一、大数据&#xff1a;智慧城市的基础与引擎 中国每天正以消失100个村庄的速度快速步入城镇化&#xff0c;未来10年内将有5亿以上的人涌入城市。这无疑会给城市的建设带来巨大的压力&#xff0c;城市资源有限&#xff0c;规模不可能无限扩张&#xff0c;城市在就业、教育、住房…

【数据库基础】数据库介绍和三大范式

数据库简介&#x1f33e;第一章 数据库简介&#x1f54a;️1.1 简介&#x1f54a;️1.2 常见数据库管理系统&#x1f54a;️1.3 三大范式&#xff08;规范&#xff09;&#x1f375;第一范式&#xff1a;&#x1f375;第二范式:&#x1f375;第三范式&#x1f33e;第一章 数据库…

实用调试技巧

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 目录什么是bug&#xff1f;调试是什么&#xff1f;有多重要&#xff1f;调试是什么调试的基本步骤debug和release的介绍windows环境调试介绍快捷键调试的时候查看程序当前…

基于51单片机六车道智能交通灯设计(仿真+源程序+PCB+论文)

资料编号&#xff1a;204 功能介绍&#xff1a;&#xff08;全套毕设资料齐全&#xff09; 本设计的交通灯以十字路口为模型&#xff0c;在实现基本的功能前提下增加了时间及温度的液晶显示。从而还增加了路口高峰期的智能化人工管理机制。 实际生活中交通信号灯的规则千变万…

C++ 大作业/课程设计 小型公司工资管理软件

小型公司工资管理软件一、实验目的二、实验要求三、项目分工四、软件设计0.效果图&#xff1a;1.类的继承关系2.类的设计3.程序运行流程4.异常处理1. 用户输入异常2.文件操作异常五、程序代码一、实验目的 熟悉面向对象程序设计思想&#xff0c;掌握类、类的派生、静态成员、多…

JVM之运行时数据区 方法区

JVM方法区概述设置方法区的大小参数如何解决这些OOM内部结构补充non-final的类变量全局变量&#xff1a;static final常量池运行时常量池方法区的演进StringTable为什么要调整&#xff1f;方法区垃圾回收总览概述 《java虚拟机规范》中明确说明&#xff1a;“尽管所有的方法区…

Tableau可视化项目

文章目录Tableau可视化项目一、数据来源二、项目介绍1.项目目的2.架构三、数据可视化1.人口1.1 总人口、城镇人口、乡村人口1.2 人口出生率、死亡率、自然增长率1.3 人口年龄结构1.4 男女比例2.居民生活水平2.1 医疗情况2.2 恩格尔系数2.3 人均消费支出3.经济3.1 能源弹性系数3…

matlab中图像分割技术之一边缘检测

1.边缘检测 &#xff08;1&#xff09;Roberts边缘算子 (2)Sobel算子 (3)Prewitt算子 (4)拉普拉斯&#xff08;Laplacian&#xff09;算子 (5)LOG&#xff08;Laplacian-Gauss&#xff09;算子 &#xff08;6)坎尼&#xff08;Canny&#xff09;算子 &#xff08;7&#xff09;…

数仓搭建-DWD层

DWD层&#xff08;用户行为日志&#xff09; 6.1.1 日志解析思路 1&#xff09;日志结构回顾 &#xff08;1&#xff09;页面埋点日志 &#xff08;2&#xff09;启动日志 2&#xff09;日志解析思路 6.1.2 get_json_object函数使用 1&#xff09;数据 [{"name&qu…

力扣(LeetCode)128. 最长连续序列(C++)

哈希集合 建立哈希集合&#xff0c;存入所有数。一次遍历数组&#xff0c;对每个数检查是否有前一个数&#xff0c;如果某个数没有前一个数&#xff0c;说明这个数是一个序列的起点&#xff0c;从这个数开始遍历得到序列长度&#xff0c;维护最大序列长度&#xff0c;即是本题…

【SpringBoot项目中Knife4j在线API文档】

目录 1. Knife4j在线API文档基本使用 2. 配置API文档信息 1. Knife4j在线API文档基本使用 Knife4j是一款基于Swagger 2的在线API文档框架。 使用Knife4j的基础步骤&#xff1a; 添加依赖在application.properties / application.yml中添加配置在项目中添加配置类关于依赖项…