【BASH】回顾与知识点梳理(二十九)
【BASH】回顾与知识点梳理 二十九
- 二十九. 进程和工作管理
- 29.1 什么是进程 (process)
- 进程与程序 (process & program)
- 子进程与父进程:
- fork and exec:进程呼叫的流程
- 系统或网络服务:常驻在内存的进程
- 29.2 Linux 的多人多任务环境
- 多人环境:
- 多任务行为:
- 多重登入环境的七个基本终端窗口:
- 特殊的进程管理行为:
- bash 环境下的工作管理 (job control)
- 多人多任务的系统资源分配问题考虑:
- 29.3 工作管理 (job control)
- 什么是工作管理?
- job control 的管理
- 直接将指令丢到背景中『执行』的 &
- 将『目前』的工作丢到背景中『暂停』:[ctrl]-z
- 观察目前的背景工作状态: jobs
- 将背景工作拿到前景来处理:fg
- 让工作在背景下的状态变成运作中: bg
- 管理背景当中的工作: kill
- 29.4 脱机管理问题
该系列目录 --> 【BASH】回顾与知识点梳理(目录)
二十九. 进程和工作管理
一个程序被加载到内存当中运作,那么在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的型态存在。那么系统的进程有哪些状态?不同的状态会如何影响系统的运作? 进程之间是否可以互相控管等等的,这些都是我们所必须要知道的项目。 另外与进程有关的还有 SELinux 这个加强文件存取安全性的咚咚,也必须要做个了解呢!
29.1 什么是进程 (process)
由前面一连几个章节的数据看来,我们一直强调在 Linux 底下所有的指令与你能够进行的动作都与权限有关, 而系统如何判定你的权限呢?当然就是账号管理当中提到的 UID/GID 的相关概念,以及文件的属性相关性啰!
再进一步来解释,你现在大概知道,在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。
』 从此以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了!
看这个定义似乎没有什么很奇怪的地方,不过,您得要了解什么叫做『触发事件』才行啊! 我们在什么情况下会触发一个事件?而同一个事件可否被触发多次?呵呵!来了解了解先!
进程与程序 (process & program)
我们如何产生一个进程呢?其实很简单啦,就是『执行一个程序或指令
』就可以触发一个事件而取得一个 PID 啰!我们说过,系统应该是仅认识 binary file
的,那么当我们要让系统工作的时候,当然就是需要启动一个 binary file 啰,那个 binary file 就是程序 (program)
啦!
那我们知道,每个程序都有三组人马的权限,每组人马都具有 r/w/x 的权限,所以:『不同的使用者身份执行这个 program 时,系统给予的权限也都不相同!
』举例来说,我们可以利用 touch 来建立一个空的文件,当 root 执行这个 touch 指令时,他取得的是 UID/GID = 0/0 的权限,而当 dmtsai (UID/GID=501/501) 执行这个 touch 时,他的权限就跟 root 不同啦!我们将这个概念绘制成图示来瞧瞧如下:
如上图所示,程序一般是放置在实体磁盘中,然后透过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程
。 为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需要的脚本与数据或文件数据等, 最后再给予一个 PID 。系统就是透过这个 PID 来判断该 process 是否具有权限进行工作的!他是很重要的哩!
举个更常见的例子,我们要操作系统的时候,通常是利用联机程序或者直接在主机前面登入,然后取得我们的 shell 对吧!那么,我们的 shell 是 bash 对吧,这个 bash 在 /bin/bash 对吧,那么同时间的每个人登入都是执行 /bin/bash 对吧!不过,每个人取得的权限就是不同!也就是说,我们可以这样看:
也就是说,当我们登入并执行 bash 时,系统已经给我们一个 PID 了,这个 PID 就是依据登入者的UID/GID (/etc/passwd) 来的啦~以上面的两张图来做说明的话,我们知道 /bin/bash 是一个程序 (program),当 dmtsai 登入后,他取得一个 PID 号码为 2234 的进程,这个进程的
User/Group 都是 dmtsai ,而当这个程序进行其他作业时,例如上面提到的 touch 这个指令时, 那么由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限的!
让我们将程序与进程作个总结:
- 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为
实体文件的型态存在
; - 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,
进程就是一个正在运作中的程序
。
子进程与父进程:
在上面的说明里面,我们有提到所谓的『衍生出来的进程
』,那是个啥咚咚?这样说好了,当我们登入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash 提供的接口去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等等,那些另外执行的指令也会被触发成为 PID ,呵呵!那个后来执行指令才产生的 PID 就是『子进程』了,而在我们原本的 bash 环境下,就称为『父进程』了!
借用我们在 Bash 谈到的 export 所用的图示好了:
所以你必须要知道,程序彼此之间是有相关性的!以上面的图示来看,连续执行两个 bash 后,第二个 bash 的父进程就是前一个 bash。因为每个进程都有一个 PID ,那某个进程的父进程该如何判断?就透过 Parent PID (PPID) 来判断即可。此外,由第十章的 export 内容我们也探讨过环境变量的继承问题,子进程可以取得父进程的环境变量啦(注意:是环境变量
)! 让我们来进行底下的练习,以了解什么是子进程/父进程。
请在目前的 bash 环境下,再触发一次 bash ,并以『 ps -l 』这个指令观察进程相关的输出信息。
答:直接执行 bash ,会进入到子进程的环境中,然后输入 ps -l 后,出现:
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 13928 13927 0 80 0 - 29038 wait pts/0 00:00:00 bash
0 S 1000 13970 13928 1 80 0 - 29033 wait pts/0 00:00:00 bash
0 R 1000 14000 13970 0 80 0 - 30319 - pts/0 00:00:00 ps
有看到那个 PID 与 PPID 吗?第一个 bash 的 PID 与第二个 bash 的 PPID 都是 13928 啊, 因为第二个bash 是来自于第一个所产生的嘛!另外,每部主机的程序启动状态都不一样, 所以在你的系统上面看到的PID 与我这里的显示一定不同!那是正常的!详细的 ps 指令我们会在本章稍后介绍, 这里你只要知道 ps -l 可以查阅到相关的进程信息即可。
很多朋友常常会发现:『咦!明明我将有问题的进程关闭了,怎么过一阵子他又自动的产生? 而且新产生的那个进程的 PID 与原先的还不一样,这是怎么回事呢?』不要怀疑,如果不是 crontab 工作排程的影响,肯定有一支父进程存在,所以你杀掉子进程后, 父进程就会主动再生一支!那怎么办?正所谓这:『擒贼先擒王』,找出那支父进程,然后将他删除就对啦!
fork and exec:进程呼叫的流程
其实子进程与父进程之间的关系还挺复杂的,最大的复杂点在于进程互相之间的呼叫。在 Linux 的进程呼叫通常称为 fork-and-exec
的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。 整个流程有点像底下这张图:
(1) 系统先以 fork 的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的差别就是 PID 不同! 但是这个暂存进程还会多一个 PPID 的参数,PPID 如前所述,就是父进程的进程标识符啦!
(2) 暂存进程开始以 exec 的方式加载实际要执行的程序,以上述图标来讲,新的程序名称为 qqq ,最终子进程的程序代码就会变成 qqq 了! 这样了解乎!
系统或网络服务:常驻在内存的进程
如果就我们之前学到的一些指令数据来看,其实我们下达的指令都很简单,包括用 ls 显示文件啊、用 touch 建立文件啊、rm/mkdir/cp/mv 等指令管理文件啊、chmod/chown/passwd 等等的指令来管理权限等等的,不过, 这些指令都是执行完就结束了。也就是说,该项指令被触发后所产生的 PID 很快就会终止呢! 那有没有一直在执行的进程啊?当然有啊!而且多的是呢!
举个简单的例子来说好了,我们知道系统每分钟都会去扫瞄 /etc/crontab 以及相关的配置文件, 来进行工作排程吧?那么那个工作排程是谁负责的?当然不是鸟哥啊! 呵呵!是 crond 这个程序所管理的,我们将他启动在背景当中一直持续不断的运作, 套句鸟哥以前 DOS 年代常常说的一句话,那就是『常驻在内存当中的进程』啦
!
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)
。系统的服务非常的多,不过主要大致分成:
- 系统本身所需要的服务,例如刚刚提到的 crond 及 atd ,还有 rsyslogd 等等的。
- 还有一些则是负责网络联机的服务,例如Apache, named, postfix, vsftpd… 等等的。这些网络服务比较有趣的地方,在于这些程序被执行后,他会启动一个可以负责网络监听的端口口 (port) ,以提供外部客户端 (client) 的联机要求。
以 crontab 来说,他的主要执行程序名称应该是 cron 或 at 才对,为啥要加个 d 在后面?而成为 crond, atd 呢?就是因为 Linux 希望我们可以简单的判断该程序是否为 daemon, 所以,一般daemon 类型的程序都会加上 d 在文件名后头~包括服务器篇我们会看到的 httpd, vsftpd 等等都是 ^_^。
29.2 Linux 的多人多任务环境
为什么 Linux 这么多用户,但是却每个人都可以拥有自己的环境了吧!^_^ !底下我们来谈谈 Linux 多人多任务环境的特色:
多人环境:
Linux 最棒的地方就在于他的多人多任务环境了!那么什么是『多人多任务』?在 Linux 系统上面具有多种不同的账号, 每种账号都有都有其特殊的权限,只有一个人具有至高无上的权力,那就是root (系统管理员)。除了 root 之外,其他人都必须要受一些限制的!而每个人进入 Linux 的环境设定都可以随着每个人的喜好来设定 (还记得我们在 BASH 提过的 ~/.bashrc 吧?对了!就是那个光!)!现在知道为什么了吧?因为每个人登入后取得的 shell 的 PID 不同嘛!
多任务行为:
我们在前面谈到 CPU 的速度,目前的 CPU 速度可高达几个 GHz。 这代表 CPU 每秒钟可以运作 10^9 这么多次指令。我们的 Linux 可以让 CPU 在各个工作间进行切换, 也就是说,其实每个工作都仅占去 CPU 的几个指令次数,所以 CPU 每秒就能够在各个进程之间进行切换啦! 谁叫 CPU 可以在一秒钟进行这么多次的指令运作。
CPU 切换进程的工作,与这些工作进入到 CPU 运作的排程 (CPU 排程,非 crontab 排程) 会影响到系统的整体效能! 目前 Linux 使用的多任务切换行为是非常棒的一个机制,几乎可以将 PC 的性能整个压榨出来! 由于效能非常好,因此当多人同时登入系统时,其实会感受到整部主机好像就为了你存在一般! 这就是多人多任务的环境啦!
多重登入环境的七个基本终端窗口:
在 Linux 当中,默认提供了六个文字界面登入窗口,以及一个图形界面,你可以使用 [Alt]+[F1]…[F7] 来切换不同的终端机界面,而且每个终端机界面的登入者还可以不同人! 很炫吧!这个东西可就很有用啦!尤其是在某个进程死掉的时候!
其实,这也是多任务环境下所产生的一个情况啦!我们的 Linux 默认会启动六个终端机登入环境的程序,所以我们就会有六个终端机接口。 您也可以减少啊!就是减少启动的终端机程序就好了。
特殊的进程管理行为:
老实说, Linux 几乎可以说绝对不会当机的
!因为他可以在任何时候,将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动!够炫吧!那么如果我在 Linux 下以文字界面登入,在屏幕当中显示错误讯息后就挂了~动都不能动,该如何是好!? 这个时候那默认的七个窗口就帮上忙啦!你可以随意的再按 [Alt]+[F1]…[F7] 来切换到其他的终端机界面,然后以 ps -aux 找出刚刚的错误进程,然后给他 kill 一下,哈哈,回到刚刚的终端机界面!恩~棒!又回复正常啰!
为什么可以这样做呢?我们刚刚不是提过吗?每个进程之间可能是独立的,也可能有相依性, 只要到独立的进程当中,删除有问题的那个进程,当然他就可以被系统移除掉啦!
bash 环境下的工作管理 (job control)
我们在上一个小节有提到所谓的『父进程、子进程』的关系,那我们登入 bash 之后, 就是取得一个名为 bash 的 PID 了,而在这个环境底下所执行的其他指令,就几乎都是所谓的子进程了。那么,在这个单一的 bash 接口下,我可不可以进行多个工作啊? 当然可以啦!可以『同时』进行喔!举例来说,我可以这样做:
[root@study ~]# cp file1 file2 &
在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个文件复制为 file2 ,且放置于背景中执行, 也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作!而当这一个指令(cp file1 file2) 执行完毕之后,系统将会在你的终端接口显示完成的消息!很便利喔!
多人多任务的系统资源分配问题考虑:
多人多任务确实有很多的好处,但其实也有管理上的困扰,因为使用者越来越多, 将导致你管理上的困扰哩!另外,由于使用者日盛,当使用者达到一定的人数后, 通常你的机器便需要升级了,因为 CPU 的运算与 RAM 的大小可能就会不敷使用!
举个例子来说,鸟哥之前的网站管理的有点不太好,因为使用了一个很复杂的人数统计程序, 这个程序会一直去取用 MySQL 数据库的数据,偏偏因为流量大,造成 MySQL 很忙碌。 在这样的情况下,当鸟哥要登入去写网页数据,或者要去使用讨论区的资源时, 哇!慢的很!简直就是『龟速』啊!后来终于将这个程序停止不用了, 以自己写的一个小程序来取代,呵呵!这样才让 CPU 的负载 (loading) 整个降下来~ 用起来顺畅多了! ^_^
29.3 工作管理 (job control)
这个工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登入系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理
』。举例来说,我们在登入 bash 后, 想要一边复制文件、一边进行资料搜寻、一边进行编译,还可以一边进行 vim 程序撰写! 当然我们可以重复登入那六个文字接口的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以啊!就是使用 job control 啦! ^_^
什么是工作管理?
从上面的说明当中,你应该要了解的是:『进行工作管理的行为中, 其实每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash !
』 这个概念请你得先建立起来,后续的范例介绍之后,你就会清楚的了解啰!
或许你会觉得很奇怪啊,既然我可以在六个终端接口登入,那何必使用 job control 呢?不要忘记了呢,我们可以在 /etc/security/limits.conf 里面设定使用者同时可以登入的联机数,在这样的情况下,某些使用者可能仅能以一个联机来工作呢! 所以啰,你就得要了解一下这种工作管理的模式了!此外,这个章节内容也会牵涉到很多的数据流重导向。
假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景 (foreground),至于其他工作就可以让你放入背景 (background)去暂停或运作
。要注意的是,放入背景的工作想要运作时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行(running) 的!因为你没有输入数据他就不会跑啊! 而且放入背景的工作是不可以使用 [ctrl]+c 来终止的!
总之,要进行 bash 的 job control 必须要注意到的限制是:
- 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
- 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
- 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
- 背景中『执行』的进程不能等待 terminal/shell 的输入(input)
job control 的管理
如前所述,bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 底下的 job 给他拿过来执行。此外,又分前景与背景,然后在背景里面的工作状态又可以分为『暂停 (stop)』与『运作中 (running)』。那实际进行 job 控制的指令有哪些?底下就来谈谈。
直接将指令丢到背景中『执行』的 &
如同前面提到的,我们在只有一个 bash 的环境下,如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,让我们可以继续操作前景的工作!那么如何将工作丢到背景中? 最简单的方法就是利用『 &
』这个玩意儿了!举个简单的例子,我们要将 /etc/ 整个备份成为/tmp/etc.tar.gz 且不想要等待,那么可以这样做:
[root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432 <== [job number] PID
[root@study ~]# tar: Removing leading `/' from member names
# 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
# 后续的 14432 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行的数据流,
# 由于我们没有加上数据流重导向,所以会影响画面!不过不会影响前景的操作喔!
不过,那么丢到背景中的工作什么时候完成?完成的时候会显示什么?如果你输入几个指令后,突然出现这个数据:
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc
就代表 [1] 这个工作已经完成 (Done) ,该工作的指令则是接在后面那一串指令列。这样了解了吧!另外,这个 & 代表:『将工作丢到背景中去执行』喔! 注意到那个『执行』的字眼!此外,这样的情况最大的好处是: 不怕被 [ctrl]+c 中断的啦! 此外,将工作丢到背景当中要特别注意资料的流向喔!包括上面的讯息就有出现错误讯息,导致我的前景被影响。 虽然只要按下 [enter] 就会出现提示字符。但如果我将刚刚那个指令改成:
[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc &
情况会怎样?在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的,所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar ,此时你怎么按下 [ctrl]+c 也无法停止屏幕被搞的花花绿绿的!所以啰,最佳的状况就是利用数据流重导向, 将输出数据传送至某个文件中。举例来说,我可以这样做:
[root@study ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 14547
[root@study ~]#
呵呵!如此一来,输出的信息都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。这样说,您应该可以更清楚数据流重导向的重要性了吧!^_^
工作号码 (job number) 只与你这个 bash 环境有关,但是他既然是个指令触发的咚咚,所以当然一定是一个进程, 因此你会观察到有 job number 也搭配一个 PID !
将『目前』的工作丢到背景中『暂停』:[ctrl]-z
想个情况:如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vim 呢?呵呵!当然不需要啊!只要暂时将 vim 给他丢到背景当中等待即可。例如以下的案例:
[root@study ~]# vim ~/.bashrc
# 在 vim 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped vim ~/.bashrc
[root@study ~]# <==顺利取得了前景的操控权!
[root@study ~]# find / -print
....(输出省略)....
# 此时屏幕会非常的忙碌!因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停
[2]+ Stopped find / -print
在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态喔!
观察目前的背景工作状态: jobs
[root@study ~]# jobs [-lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
# 范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令吧!一般来说,直接下达 jobs 即可! 不过,如果你还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数啦! 在输出的信息当中,例如上表,仔细看到那个 + - 号喔!那个 + 代表预设的取用工作
。 所以说:『目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理
』!
将背景工作拿到前景来处理:fg
刚刚提到的都是将工作丢到背景当中去执行的,那么有没有可以将背景工作拿到前景来处理的? 有啊!就是那个fg (foreground)
啦!举例来说,我们想要将上头范例当中的工作拿出来处理时:
[root@study ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
# 范例一:先以 jobs 观察工作,再将工作取出:
[root@study ~]# jobs -l
[1]- 14566 Stopped vim ~/.bashrc
[2]+ 14567 Stopped find / -print
[root@study ~]# fg <==预设取出那个 + 的工作,亦即 [2]。立即按下[ctrl]-z
[root@study ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
[root@study ~]# jobs -l
[1]+ 14566 Stopped vim ~/.bashrc
[2]- 14567 Stopped find / -print
经过 fg 指令就能够将背景工作拿到前景来处理啰!不过比较有趣的是最后一个显示的结果,我们会发现 + 出现在第一个工作后! 怎么会这样啊?这是因为你刚刚利用 fg %1 将第一号工作捉到前景后又放回背景,此时最后一个被放入背景的将变成 vi 那个指令动作,所以当然 [1] 后面就会出现 + 了!了解乎!另外,如果输入『fg -
』 则代表将 - 号的那个工作号码拿出来
,上面就是 [2]- 那个工作号码啦!
让工作在背景下的状态变成运作中: bg
我们刚刚提到,那个 [ctrl]-z 可以将目前的工作丢到背景底下去『暂停
』, 那么如何让一个工作在背景底下『 Run
』呢?我们可以在底下这个案例当中来测试! 注意喔!底下的测试要进行的快一点!^_^
# 范例一:一执行 find / -perm /7000 > /tmp/text.txt 后,立刻丢到背景去暂停!
[root@study ~]# find / -perm /7000 > /tmp/text.txt
# 此时,请立刻按下 [ctrl]-z 暂停!
[3]+ Stopped find / -perm /7000 > /tmp/text.txt# 范例二:让该工作在背景下进行,并且观察他!!
[root@study ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[1]- Stopped vim ~/.bashrc
[2]+ Stopped find / -print
[3] Running find / -perm /7000 > /tmp/text.txt &
看到哪里有差异吗?呼呼!没错!就是那个状态栏~以经由 Stopping 变成了 Running 啰! 看到差异点,嘿嘿!指令列最后方多了一个 & 的符号啰! 代表该工作被启动在背景当中了啦
! ^_^
管理背景当中的工作: kill
刚刚我们可以让一个已经在背景当中的工作继续工作,也可以让该工作以 fg 拿到前景来, 那么,如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯号 (signal) ,让他知道该怎么作才好啊!此时, kill 这个指令就派上用场啦!
[root@study ~]# kill -signal %jobnumber
[root@study ~]# kill -l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:-1 :重新读取一次参数的配置文件 (类似 reload);-2 :代表与由键盘输入 [ctrl]-c 同样的动作;-9 :立刻强制删除一个工作;-15:以正常的进程方式终止一项工作。与 -9 是不一样的。
# 范例一:找出目前的 bash 环境下的背景工作,并将该工作『强制删除』。
[root@study ~]# jobs
[1]+ Stopped vim ~/.bashrc
[2] Stopped find / -print
[root@study ~]# kill -9 %2; jobs
[1]+ Stopped vim ~/.bashrc
[2] Killed find / -print
# 再过几秒你再下达 jobs 一次,就会发现 2 号工作不见了!因为被移除了!# 范例二:找出目前的 bash 环境下的背景工作,并将该工作『正常终止』掉。
[root@study ~]# jobs
[1]+ Stopped vim ~/.bashrc
[root@study ~]# kill -SIGTERM %1
# -SIGTERM 与 -15 是一样的!您可以使用 kill -l 来查阅!
# 不过在这个案例中, vim 的工作无法被结束喔!因为他无法透过 kill 正常终止的意思!
特别留意一下, -9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15 也是默认值),两者之间并不相同呦
!举上面的例子来说, 我用 vim 的时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal 时, vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中。这样您应该可以稍微分辨一下了吧?
不过,毕竟正常的作法中,你应该先使用 fg 来取回前景控制权,然后再离开 vim 才对~因此,以上面的范例二为例,其实 kill 确实无法使用 -15 正常的结束掉 vim 的动作喔!此时还是不建议使用 -9 啦!因为你知道如何正常结束该进程不是吗? 通常使用 -9 是因为某些程序你真的不知道怎么透过正常手段去终止他,这才用到 -9 的!
其实,kill 的妙用是很无穷的啦!他搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关资料) 可以让您有效的管理工作与进程 (Process),此外,那个 killall 也是同样的用法! 至于常用的 signal 您至少需要了解 1, 9, 15 这三个 signal 的意义才好。 此外, signal 除了以数值来表示之外,也可以使用讯号名称喔! 举例来说,上面的范例二就是一个例子啦!至于 signal number 与名称的对应, 呵呵,使用 kill -l 就知道啦(L 的小写)!
另外, kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %
数字 了,这点也得特别留意才行喔!
29.4 脱机管理问题
要注意的是,我们在工作管理
当中提到的『背景
』指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境
, 你可以说那个是 bash 的背景,并不是放到系统的背景去喔!所以,工作管理的背景依旧与终端机有关啦! 在这样的情况下,如果你是以远程联机方式连接到你的 Linux 主机,并且将工作以 & 的方式放到背景去, 请问,在工作尚未结束的情况下你脱机了,该工作还会继续进行吗?答案是『否』!不会继续进行,而是会被中断掉。
那怎么办?如果我的工作需要进行一大段时间,我又不能放置在背景底下,那该如何处理呢? 首先,你可以参考前一章的 at 来处理即可!因为 at 是将工作放置到系统背景, 而与终端机无关。如果不想要使用 at 的话,那你也可以尝试使用 nohup
这个指令来处理喔!这个 nohup 可以让你在脱机或注销系统后,还能够让工作继续进行。他的语法有点像这样:
[root@study ~]# nohup [指令与参数] <==在终端机前景中工作
[root@study ~]# nohup [指令与参数] & <==在终端机背景中工作
有够好简单的指令吧!上述指令需要注意的是, nohup 并不支持 bash 内建的指令,因此你的指令必须要是外部指令才行
。 我们来尝试玩一下底下的任务吧!
# 1. 先编辑一支会『睡着 500 秒』的程序:
[root@study ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."
# 2. 丢到背景中去执行,并且立刻注销系统:
[root@study ~]# chmod a+x sleep500.sh
[root@study ~]# nohup ./sleep500.sh &
[2] 14812
[root@study ~]# nohup: ignoring input and appending output to `nohup.out' <==会告知这个讯息!
[root@study ~]# exit
如果你再次登入的话,再使用 pstree
去查阅你的进程,会发现 sleep500.sh 还在执行中喔!并不会被中断掉! 这样了解意思了吗?由于我们的程序最后会输出一个讯息,但是 nohup 与终端机其实无关了,因此这个讯息的输出就会被导向『 ~/nohup.out 』,所以你才会看到上述指令中,当你输入 nohup 后, 会出现那个提示讯息啰。
如果你想要让在背景的工作在你注销后还能够继续的执行,那么使用nohup 搭配 &
是不错的运作情境喔! 可以参考看看!
相关文章:
【BASH】回顾与知识点梳理(二十九)
【BASH】回顾与知识点梳理 二十九 二十九. 进程和工作管理29.1 什么是进程 (process)进程与程序 (process & program)子进程与父进程:fork and exec:进程呼叫的流程系统或网络服务:常驻在内存的进程 29.2 Linux 的多人多任务环境多人环境…...
Docker的Cgroup资源限制
Docker通过Cgroup来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配颡和使用量控制。 Cgoup 是CotrolGroups 的缩写,是Linux 内核提供的一种可以限制、记录、隔高进程组所使用的物理资源(如CPU、内存…...
AI智能语音机器人的基本业务流程
先画个图,了解下AI语音机器人的基本业务流程。 上图是一个AI语音机器人的业务流程,简单来说就是首先要配置话术,就是告诉机器人在遇到问题该怎么回答,这个不同公司不同行业的差别比较大,所以一般每个客户都会配置其个性…...
uniapp 上传比较大的视频文件就超时
uni.uploadFile,上传超过10兆左右的文件就报错err:uploadFile:fail timeout,超时 解决: 在manifest.json文件中做超时配置 uni.uploadFile({url: this.action,method: "POST",header: {Authorization: uni.getStorage…...
CSS简介
目录 CSS CSS概念 核心概念 为什么需要CSS 语法 CSS的引入方式 内联样式(行内样式) 内部样式 外部样式(推荐) CSS CSS概念 CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表&am…...
卡方分箱(chi-square)
统计学,风控建模经常遇到卡方分箱算法ChiMerge。卡方分箱在金融信贷风控领域是逻辑回归评分卡的核心,让分箱具有统计学意义(单调性)。卡方分箱在生物医药领域可以比较两种药物或两组病人是否具有显著区别。但很多建模人员搞不清楚…...
深入理解 Flutter 图片加载原理
作者:京东零售 徐宏伟 来源:京东云开发者社区 前言 随着Flutter稳定版本逐步迭代更新,京东APP内部的Flutter业务也日益增多,Flutter开发为我们提供了高效的开发环境、优秀的跨平台适配、丰富的功能组件及动画、接近原生的交互体验…...
【电子通识】什么是异常分析中的A-B-A方法
工作有了一定的经验之后,在做问题分析的时候,经常会听到别人说把这个部品(芯片/模块)拿去ABA一下,看看跟谁走。那么对于新人来说是否就会问一个问题:什么是ABA呢? A-B-A 交换是一种简单直接的交…...
[Linux] C获取键盘输入值
检测指令:cat /dev/input/event1 | hexdump 当键盘有输入时,会有对应的一堆16进制输出。它其实对应着input_event结构体【24字节】。 struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value; }; #include <st…...
探索Python编程世界:开启你的代码之旅
亲爱的小伙伴们,大家好!很高兴向大家推荐我的新专栏《Python编程指南:从入门到高级》。在这个专栏里,我将带领大家深入探索Python编程的奇妙世界,为您提供有趣、实用、易懂的内容,帮助您在编程的道路上越走…...
金融术语总结
洗钱 将犯罪或其他非法违法行为所获得的违法收入,通过各种手段掩饰、隐瞒、转化,使其在形式上合法化的行为。 存量客户 某个时间段里原先已有的客户,与新增客户相对应。 月活跃用户数量,MAU(Monthly Active User,M…...
Linux驱动开发(Day5)
思维导图: 不同设备号文件绑定:...
[机器学习]特征工程:主成分分析
目录 主成分分析 1、简介 2、帮助理解 3、API调用 4、案例 本文介绍主成分分析的概述以及python如何实现算法,关于主成分分析算法数学原理讲解的文章,请看这一篇: 探究主成分分析方法数学原理_逐梦苍穹的博客-CSDN博客https://blog.csdn.…...
Python爬虫实战案例——第一例
X卢小说登录(包括验证码处理) 地址:aHR0cHM6Ly91LmZhbG9vLmNvbS9yZWdpc3QvbG9naW4uYXNweA 打开页面直接进行分析 任意输入用户名密码及验证码之后可以看到抓到的包中传输的数据明显需要的是txtPwd进行加密分析。按ctrlshiftf进行搜索。 定位来到源代码中断点进行调…...
一、openlayer开发介绍
首先需要引入openlayer api开发包。两种方式: 1、import方式,也就是npm安装,npm install ol 2、外部js引入。 下载地址:https://github.com/openlayers/openlayers 历史版本地址:Releases openlayers/openlayers …...
利用Jackson封装常用的JsonUtil工具类
在实际开发中,我们对于 JSON 数据的处理,通常有这么几个第三方工具包可以使用: gson:谷歌的fastjson:阿里巴巴的jackson:美国FasterXML公司的,Spring框架默认用的 由于以前一直用习惯了阿里的…...
阿里云2核4G服务器配置汇总表_轻量和ECS
阿里云2核4G服务器配置价格表,297元一年,配置为轻量应用服务器2核4G、4M带宽、60GB高效云盘,折合24元一个月。 目录 2核4G服务器轻量: 2核4G服务器ECS 关于轻量和ECS的区别: 2核4G服务器轻量: 云服务器…...
攻防世界-ics-06
原题解题思路 看着页面多,其实只有报表中心能够跳转,但是选了确定后没反应,应该不是注入,只有id会变化。 在burp中设置好负载进行爆破 有一个长度与众不同的包 打开发现flag。...
人工智能轨道交通行业周刊-第56期(2023.8.14-8.20)
本期关键词:数字化建设、巡检机器人、智慧城轨、福州地铁4号线、避雷器、LangChain 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMet…...
ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本
目前ruoyi-vue-pro 项目虽然开源,但是report模块被屏蔽了,查看文档却要收费 199元(知识星球),价格有点太高了吧。 分享下如何启用 report 模块,顺便贴上sql相关脚本。 一、启用模块 修改根目录 pom.xml …...
【第三阶段】kotlin中使用带let的安全调用
let常常和?.配合使用,如果前面的对象为null,let不执行,能够执行到let里面 对象一定不为null 1.不为null fun main() {var name:String?"kotlin" //name是一个可空类型,发出广播,调用的地方必须补救措施var…...
JavaScript 快速入门手册
本篇文章学习: 菜鸟教程、尚硅谷。 JavaScript 快速入门手册 💯 前言: 本人目前算是一个Java程序员,但是目前环境… ε(ο`*))) 一言难尽啊,blog也好久好久没有更新了,一部分工作原因吧(外包真…...
FreeMarker系列--list的用法(长度,遍历,下标,嵌套,排序)
原文网址:FreeMarker系列--list的用法(长度,遍历,下标,嵌套,排序)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍FreeMarker的list的用法。 大小 Java ArrayList<String> list new ArrayList<String>(); Freemaker ${list?s…...
【观察】戴尔科技:构建企业创新“韧性”,开辟数实融合新格局
过去几年,国家高度重视发展数字经济,将其上升为国家战略。其中,“十四五”规划中,就明确提出要推动数字经济和实体经济的深度融合,以数字经济赋能传统产业转型升级;而2023年年初正式发布的《数字中国建设整…...
数据管理平台
数据管理平台项目 文章目录 数据管理平台项目业务1-登录验证代码步骤: token 技术token的使用代码步骤 axios 请求拦截器语法代码示例 axios响应拦截器优化axios响应结果发布文章-富文本编辑器发布文章-频道列表发布文章-封面设置发布文章-收集并保存内容管理-文章列…...
手搓大语言模型 使用jieba分词制作词表,词表大小几十万 加强依赖性
jieba分词词表生成与训练 import numpy as np import paddle import pandas as pd from multiprocessing import Process, Manager, freeze_support from just_mask_em import JustMaskEm, HeadLoss from tqdm import tqdm from glob import glob import jieba import warning…...
【校招VIP】java语言类和对象之map、set集合
考点介绍: map、set集合相关内容是校招面试的高频考点之一。 map和set是一种专门用来进行搜索的容器或者数据结构,其搜索效率与其具体的实例化子类有关系。 『java语言类和对象之map、set集合』相关题目及解析内容可点击文章末尾链接查看! …...
windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动
前两天由于项目需要,一个windows上的批处理任务(kitchen.bat),需要接到mq的消息通知后执行,为了快速实现这里我们通过springboot写了一个jar程序,用于接收mq的消息,并调用bat文件。 本程序需要实…...
七夕特辑(一)浪漫表白方式 用神经网络生成一首情诗
目录 一、准备工作二、用神经网络生成一首诗,代码说明 牛郎织女相会,七夕祝福要送来。祝福天下有情人,终成眷属永相伴。 七夕是中国传统的情人节,也是恋人们表达爱意的好时机。在这个特别的日子里,送上温馨的祝福&…...
springboot的 spring.redis.lettuce的max-active、max-idle、min-idle的搭配
在Spring Boot中,使用Lettuce作为Redis客户端是一种常见的选择。Lettuce是一个高性能、可扩展的异步Redis客户端。下面是关于application.yml配置文件中spring.redis.lettuce的一些配置: spring:redis:host: localhostport: 6379database: 0lettuce:poo…...
盒子模型样式
🍓盒子属性 属性名称中文注释备注border设置盒子的边框边框宽度 边框类型 边框颜色border-left设置左边框边框宽度 边框类型 边框颜色border-right设置右边框边框宽度 边框类型 边框颜色border-top设置上边框边框宽度 边框类型 边框颜色border-bottom设置下边框边框…...
动态规划入门之线性动态规划
P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求求连续得一段子串使其累加和最大。 我们做动态规划首先考虑小情况,然后推而广之。 假设三个数1,-2,5. 我们先选1然后我们在-2以及-2加1里边选,我们选…...
基于HTML+CSS+Echarts大屏数据可视化集合共99套
基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…...
Leetcode 0814周总结
本周刷题: 88, 108, 121, 219, 228, 268, 283, 303, 349, 350, 414, 448 88 合并两个有序数组 nums1{1, 2, 3 ,0, 0, 0} nums2{2, 5, 6} 合成效果:nums1{1, 2, 2, 3, 5, 6} 思路:【双指针】对两个数组设置双指针,依次比较哪…...
华为网络篇 OSPF的Silent-Interface-33
难度1复杂度1 目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑; 2.初始化各设备,配置相应的IP地址,测试直连网络的连通性; 3.整个网络配置OSPF协议,查看…...
longtext,bigint是什么数据类型
longtext 是一种数据类型,用于在关系型数据库中存储长文本或大段的文本数据。它通常用于存储超过普通文本长度限制的内容,比如文章、博客内容、HTML 代码等。 在多数关系型数据库中,longtext 是一种用于存储可变长度字符数据的类型ÿ…...
Hive无法启动的解决方案
关掉虚拟机后,重新启动后,按照Hadoop和Hive的流程重新启动,发现无法启动成功,特别是元数据服务无法启动,出现以下错误: Exception in thread “main” java.lang.RuntimeException: java.net.ConnectException: Call F…...
华为云零代码新手教学-体验通过Astro Zero快速搭建微信小程序
您将会学到 您将学会如何基于Astro零代码能力,DIY开发,完成问卷、投票、信息收集、流程处理等工作,还能够在线筛选、分析数据。实现一站式快速开发个性化应用,体验轻松拖拽开发的乐趣。 您需要什么 环境准备 注册华为云账号、实…...
【前端】快速掌握HTML+CSS核心知识点
文章目录 1.HTML核心基础知识1.1.编写第一个HTML网页1.2.超链接a标签和路径1.3.图像img标签的用法1.4.表格table标签用法1.5.列表ul、ol、dl标签用法1.6.表单form标签用法1.7.区块标签和行内标签用法 2.CSS核心基础知识2.1.CSS标签选择器viewport布局2.2.CSS样式的几种写法2.3.…...
二叉树算法的框架套路总结
二叉树算法的框架套路总结 总结 本文主要来源于Leetcode用户:https://leetcode.cn/u/labuladong/,感谢写了这么好的文章作者:labuladong 链接:https://leetcode.cn/problems/same-tree/solutions/6558/xie-shu-suan-fa-de-tao-l…...
【ARM 嵌入式 编译 Makefile 系列 2 - Makefile 如何打印信息】
文章目录 Makefile 打印信息方法介绍Makefile 打印信息方法介绍 在Makefile中,我们可以使用echo命令来打印信息。这种方法适用于大多数的 UNIX shell,包括bash、sh、ksh、zsh等。 在 Makefile 中的规则部分,你可以添加 echo 命令来打印一些信息。例如: all: echo "…...
re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)
参考文章: re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…...
centos 7.9 部署django项目
1、部署框架 主要组件:nginx、uwsgi、django项目 访问页面流程:nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统:centos 7.9 配置信息:4核4G 50G 内网 eip :10.241.103.216 部署过程&…...
12 正则表达式 | HTTP协议相关介绍
文章目录 正则表达式re模块最基础操作(匹配开头)匹配单个字符匹配多个字符匹配开头结尾匹配分组对于group的理解r的作用re 模块高级用法compilesearchfindall易错点 sub直接替换函数替换 split 根据匹配进行切割字符串,并返回一个列表 python…...
【C语言】数组概述
🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 🔥该篇将带你了解 一维数组,二维数组等相关知识。 目录: 📘前言:…...
8. 实现业务功能--用户注册
目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能: model 包:实体对象 d…...
深入浅出Pytorch函数——torch.nn.init.eye_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)
目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA,Git项目搭建 1、本地仓库搭建 1)创建一个新项目 2)打开终端,在当前目录新建一个Git代码库 3)忽略文件 …...
【链表】 61. 旋转链表
61. 旋转链表 解题思路 首先计算出链表长度将链表长度进行取余遍历链表 对链表进行分割 得到两个子链表重新连接两个链表比如1 2 3 4 5 k 2 进行分割得到 1 2 3 和 4 5两个子链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...
深入浅出Pytorch函数——torch.nn.init.kaiming_uniform_
分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...
uni-app x 跨平台开发框架
目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。 uni-app x 是一个庞…...
【Unity 3D角色移动】
【Unity 3D角色移动】 在Unity 3D中实现角色移动通常涉及到几个关键步骤,包括设置角色的物理属性、处理输入、更新角色的位置以及动画同步。下面是实现基本3D角色移动的步骤和示例代码: 步骤1:设置角色的物理属性 角色通常使用Character Co…...
Monorepo(单体仓库)与 MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南
🔥 个人主页:空白诗 文章目录 一、引言1. Monorepo 和 MultiRepo 简介2. 为什么选择 Monorepo? 二、Monorepo 和 MultiRepo 的区别1. 定义和概述2. 各自的优点和缺点3. 适用场景 三、Monorepo 的开发策略1. 版本控制2. 依赖管理3. 构建和发布…...
MySQL的Geometry数据处理之WKB方案
MySQL的Geometry数据处理之WKT方案:https://blog.csdn.net/qq_42402854/article/details/140134357 MySQL的Geometry数据处理之WKT方案中,介绍WTK方案的优点,也感受到它的繁琐和缺陷。比如: 需要借助 ST_GeomFromText和 ST_AsTex…...
ES(笔记)
es就是json请求体代替字符串查询 dsl查询和过滤,一个模糊查询,一个非模糊查询 must,should 做模糊查询的,里面都是match,根据查询内容进行匹配,filter过滤,term词元查询,就是等值查…...
【代码随想录——图论——图论理论基础】
1. 图论理论基础 1.1 图的基本概念 二维坐标中,两点可以连成线,多个点连成的线就构成了图。 当然图也可以就一个节点,甚至没有节点(空图) 1.1.1 图的种类 有向图 加权有向图无权有向图 无向图 加权无向图无权无向…...
从动态代理角度简单理解Spring AOP
1. 概述 动态代理 是指在运行时,动态地创建目标类的代理对象,并对其中特定的方法进行拦截或增强的技术。这种技术主要用于在不修改目标类代码的情况下,增强目标类的功能。 在Java中,动态代理主要基于Java的反射机制和接口来实现…...
MFC CList<CRect, CRect> m_listRect;的用法
CList<CRect, CRect&> 是 MFC(Microsoft Foundation Classes)中定义的一个双向链表模板类,用于存储 CRect 对象。在使用 CList 时,你可以执行多种操作,比如添加、移除、查找和遍历元素。以下是一些常见的用法…...
【大数据】Hadoop 2.X和1.X升级优化对比
目录 1.前言 2.hadoop 1.X的缺点和优化方向 3.解决NameNode的局限性 3.1.Hadoop HA 3.2.Haddop federation 4.yarn 5.周边组件 1.前言 本文是作者大数据系列中的一文,专栏地址: https://blog.csdn.net/joker_zjn/category_12631789.html?spm10…...
Sublime Text 基础教程(个人总结)
Sublime Text 是一款广受欢迎的代码编辑器,以其简洁的界面和强大的功能而著称。它支持多种编程语言,具有高效的代码编辑和管理功能。本教程将详细介绍如何使用 Sublime Text,从安装到高级使用技巧,帮助你充分利用这款工具。 目录…...
大模型基础知识
文章目录 1. 位置编码1.1 绝对位置编码1.2 相对位置编码1.3 旋转位置编码2. 注意力机制2.1 MHA(muti head attention)2.2 MQA(muti query attention)2.3 GQA(grouped query attention)3. 大模型分类4. 微调方法4.1 Prompt Tuning4.2 Prefix Tuning4.3 Lora4.4 QLora5. La…...
【Numpy】NumPy基础入门:创建和管理多维数组
NumPy基础入门:创建和管理多维数组 简介 NumPy(Numerical Python的简称)是Python语言的一个基础科学计算库,广泛应用于数据分析、机器学习、科学计算和工程领域。NumPy的核心是其强大的N维数组对象ndarray,它为Pytho…...