Linux(14):进程管理

一个程序被加载到内存当中运作,那么在内存内的那个数据就被称为进程(process)。
进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的型态存在。

进程

在 Linux底下所有的指令与能够进行的动作都与权限有关,而系统如何判定权限呢?
通过 UID/GID 以及文件的属性相关性,进一步来解释,在 Linux系统当中:【触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个ID,称为PID,同时依据启发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定。】从此以后,这个PID能够在系统上面进行的动作,就与这个PID的权限有关了。

进程与程序

【执行一个程序或指令】就可以触发一个事件而取得一个 PID。
文件和目录的权限由三个部分组成:所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限(r/w/x)。
【不同的使用者身份执行同一个 program 时,系统给与的权限并不相同】
在这里插入图片描述
如上图所示,程序一般是放置在实体磁盘中,然后透过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需要的脚本与数据或文件数据等,最后再给予一个PID。系统就是透过这个 PID来判断 process是否具有权限进行工作的。

当我们登入并执行 bash 时,系统已经给我们一个 PID了,这个 PID 就是依据登入者的UID/GID (/etc/passwd)来的。

程序(program): 通常为 binary program ,放置在储存媒体中(如硬盘、光盘、软盘、磁带等),为实体文件的型态存在;
进程(process): 程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中,操作系统并给予这个内存内的单元一个标识符(PID),可以说,进程就是一个正在运作中的程序。

子进程与父进程
当我们登入系统后,会取得一个 bash 的 shell ,然后,用这个 bash 提供的接口去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等等,那些另外执行的指令也会被触发成为 PID ,后来执行指令才产生的PID就是【子进程】,而在原本的 bash 环境下,就称为【父进程】。
在这里插入图片描述
程序彼此之间是有相关性的,连续执行两个 bash 后,第二个bash的父进程就是前一个bash。
因为每个进程都有一个PID,那某个进程的父进程可以透过 Parent PID(PPID)来判断。

fork and exec:进程呼叫的流程
子进程与父进程之间最大的复杂点在于进程互相之间的呼叫。
在 Linux 的进程呼叫通常称为 fork-and-exec 的流程:进程都会由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
在这里插入图片描述
(1)系统先以fork 的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的差别就是PID不同。但是这个暂存进程还会多一个 PPID 的参数,PPID 就是父进程的进程标识符;然后(2)暂存进程开始以exec 的方式加载实际要执行的程序,最终子进程的程序代码就是实际要执行程序的ID。

系统或网络服务:常驻在内存的进程
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务(daemon)
系统的服务非常的多,不过主要大致分成系统本身所需要的服务,例如crond 及 atd ,还有 rsyslogd 等等的。还有一些则是负责网络联机的服务,例如Apache, named, postfix, vsftpd…等等的。这些网络服务在程序被执行后,他会启动一个可以负责网络监听的端口口 (port),以提供外部客户端(client)的联机要求。

Linux 的多人多任务环境

在Linux底下执行一个指令时,系统会将相关的权限、属性、程序代码与数据等均加载内存,并给予这个单元一个进程标识符(PID),最终该指令可以进行的任务则与这个PID的权限有关。
Linux 也因此允许多用户,且每个人都可以拥有自己的环境。

多人环境:
在 Linux系统上面具有多种不同的账号,每种账号都有都有其特殊的权限,每个人进入Linux的环境设定都可以随着每个人的喜好来设定(~./bashrc)。root(系统管理员) 具有至高无上的权力。

多任务行为:
Linux可以让 CPU 在各个工作间进行切换,也就是说,其实每个工作都仅占去 CPU 的几个指令次数,所以 CPU 每秒就能够在各个进程之间进行切换。CPU 切换进程的工作,与这些工作进入到 CPU 运作的排程(CPU排程,非crontab排程)会影响到系统的整体效能。

多重登入环境的七个基本终端窗口:
在 Linux当中,默认提供了六个文字界面登入窗口,以及一个图形界面,可以使用 [Alt]+[F1].……[7] 来切换不同的终端机界面,而且每个终端机界面的登入者还可以不同人。
其实,这也是多任务环境下所产生的一个情况,Linux 默认会启动六个终端机登入环境的程序,所以就会有六个终端机接口。

特殊的进程管理行为:
Linux几乎可以说绝对不会当机的。因为他可以在任何时候,将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动。
如果 在Linux 下以文字界面登入,在屏幕当中显示错误讯息后就挂了~动都不能动,【可以随意的再按[Alf]+[F1.].….F7] 来切换到其他的终端机界面,然后以 ps -aux 找出刚刚的错误进程,然后给他kill一下】,回到刚刚的终端机界面就又回复正常了。每个进程之间可能是独立的,也可能有相依性,只要到独立的进程当中,删除有问题的那个进程,当然他就可以被系统移除掉。

bash 环境下的工作管理(job control)
登入 bash之后,就是取得一个名为 bash 的 PID了,而在这个环境底下所执行的其他指令,就几乎都是所谓的子进程了。在这个单一的 bash接口下,可以进行多个工作:

cp file1 file2 &

在这一串指令中,重点在那个 & 的功能,他表示将 file1 这个文件复制为 file2 ,且放置于背景中执行,也就是说执行这一个命令之后,在这一个终端接口仍然可以做其他的工作。而当这一个指令(cp file1 file2)执行完毕之后,系统将会在终端接口显示完成的消息。

多人多任务的系统资源分配问题考虑:
多人多任务有管理上的困扰,因为使用者越来越多,当使用者达到一定的人数后,通常机器便需要升级了,因为CPU的运算与 RAM的大小可能就会不敷使用。

工作管理

这个工作管理(job control)是用在 bash环境下的,当登入系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理。

什么是工作管理

进行工作管理的行为中,其实每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。我们【无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash】。

由于假设我们只有一个终端接口,因此【在可以出现提示字符让你操作的环境就称为前景(foreground)】,至于【其他工作就可以让你放入背景(background)去暂停或运作】。
要注意的是,放入背景的工作想要运作时,他必须不能够与使用者互动。举例来说, vim绝对不可能在背景里面执行(running)的。因为你没有输入数据他就不会跑。而且【放入背景的工作是不可以使用 [ctrl]+c 来终止的】。

要进行 bash 的 job control 必须要注意到的限制是:
1.这些工作所触发的进程必须来自于 shell 的子进程(只管理自己的 bash);
2.前景:可以控制与下达指令的这个环境称为前景的工作(foreground);
3.背景:可以自行运作的工作,无法使用[ctrl]+c 终止他,可使用bg/fg 呼叫该工作;
4.背景中【执行】的进程不能等待 terminal/shell 的输入(input)。

job control 的管理

bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使是 root 也不能够将别人的 bash底下的 job 给他拿过来执行。

直接将指令丢到背景中【执行】的 &
在输入一个指令后,在该指令的最后面加上一个【&】代表将该指令丢到背景中,此时 bash 会给予这个指令一个【工作号码(job number)】。
在这里插入图片描述工作号码(job number)只与这个 bash环境有关,但是他既然是个指令触发的东西,所以当然一定是一个进程,因此 job number 也会搭配一个 PID。

& 代表:【将工作丢到背景中去执行】,不会被 [ctrl]+c 中断。
将工作丢到背景当中要特别注意资料的流向,否则可能出现的某些错误讯息,会导致前景被影响。

将【目前】的工作丢到背景中【暂停】:[ctrl]-z
如果正在使用vim ,却发现有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时不需要结束vim,只要暂时将vim 给他丢到背景当中等待即可。

在 vim 的一般模式下,按下[ctrl]及z这两个按键,屏幕上会出现[1],表示这是第一个工作,而那个代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作(与 fg 这个指令有关)。而那个Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是【暂停】的状态。

观察目前的背景工作状态:jobs

jobs [-lrs]

在这里插入图片描述如果想要知道目前有多少的工作在背景当中,一般来说,直接下达 jobs即可。不过,如果还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数。
在这里插入图片描述在输出的信息当中,代表预设的取用工作。所以说:【目前我有两个工作在背景当中,两个工作都是暂停的,而如果我仅输入 fg 时,那么这个 [2] 会被拿到前景当中来处理】
其实代表最近被放到背景的工作号码,代表最近最后第二个被放置到背景中的工作号码。而超过最后第三个以后的工作,就不会有+/-符号存在了。

将背景工作拿到前景来处理:fg
fg(foreground) 可以将背景工作拿到前景来处理。

fg %jobnumber
# %jobnumber:jobnumber 为工作号码(数字),% 是可由可无的

fig - 代表将 - 号的那个工作号码拿出来。

让工作在背景下的状态变成运作中:bg

bg %jobnumber

[ctrl]-z 可以将目前的工作丢到背景底下去【暂停】,bg 让一个工作在背景底下【Run】

管理背景当中的工作:kill
将工作直接移除。

kill -signal %jobnumber
kill -l

在这里插入图片描述特别留意,-9 这个 signal 通常是用在【强制删除一个不正常的工作】时所使用的,-15 则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同。-SIGTERM-15 是一样的。
举例来说,用vim 的时候,会产生一个.filename.swp 的文件。那么,当使用 -15 这个signal 时, vim 会尝试以正常的步骤来结束掉该vi的工作,所以 .filename.swp 会主动的被移除;但若是使用-9这个 signal 时,由于该 vim 工作会被强制移除掉,因此,.filename.swp就会继续存在文件系统当中。

kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上%数字了。

脱机管理问题

要注意的是,在工作管理当中提到的【背景】指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境,可以说那个是 bash 的背景,并不是放到系统的背景去;所以,工作管理的背景依旧与终端机有关。
在这样的情况下,如果是以远程联机方式连接到 Linux 主机,并且将工作以 & 的方式放到背景去,在工作尚未结束的情况下脱机了,该工作不会继续进行,而是会被中断掉

那怎么办?如果工作需要进行一大段时间,又不能放置在背景底下,那该如何处理?
首先,可以参考at来处理即可,因为 at 是将工作放置到系统背景,而与终端机无关。如果不想要使用 at 的话,也可以尝试使用 nohup 这个指令来处理,这个 nohup 可以在脱机或注销系统后,还能够让工作继续进行。

# 在终端机前景中工作
nohup [指令与参数]
# 在终端机背景中工作
nohup [指令与参数] &

需要注意的是,nohup 并不支持 bash 内建的指令,必须要是外部指令才行

进程管理

进程的观察

ps:将某个时间点的进程运作情况撷取下来

ps aux #观察系统所有的进程数据
ps -lA #也能观察所有系统的数据
ps axjf #连同部分进程树状态

在这里插入图片描述一个是只能查阅自己bash进程的【ps -l】一个则是可以查阅所有系统运作的进程【ps aux】。
注意,【ps aux】没有那个减号(-)

仅观察自己的 bash 相关进程:ps -l
在这里插入图片描述

F:代表这个进程旗标(process flags),说明这个进程的总结权限,常见号码有:
若为 4 表示此进程的权限为root;
若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)
S:代表这个进程的状态(STAT),主要的状态有:
R(Running):该程序正在运作中;
S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
D:不可被唤醒的睡眠状态,通常这支程序可能在等待IO 的情况(ex>打印).
T:停止状态(stop),可能是在工作控制(背景暂停)或除错(traced)状态;
Z(Zombie):僵尸状态,进程已经终止但却无法被移除至内存外。
UID/PID/PPID:代表【此进程被该UID所拥有/进程的PID号码/此进程的父进程 PID号码】
C:代表 CPU使用率,单位为百分比;
PRI/NI:Priority/Nice 的缩写,代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个 running 的进程,一般就会显示【-】/SZ 代表此进程用掉多少内存,/WCHAN表示目前进程是否运作中,同样的,若为 【–】 表示正在运作中。
TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);
TIME:使用掉的CPU时间,注意,是此进程实际花费CPU运作的时间,而不是系统时间;
CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。

观察系统所有线程:ps aux
在这里插入图片描述
USER:该 process 属于哪个使用者账号;
PID:该 process 的进程标识符。
RCPU:该 process 使用掉的 CPU 资源百分比;
RMEM:该 process 所占用的物理内存百分比;
VSZ:该 process 使用掉的虚拟内存量(Kbytes);
RSS:该process 占用的固定的内存量(Kbytes)
TTY:该 process 是在那个终端机上面运作,若与终端机无关则显示?,另外, tty1-tty6是本机上面的登入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同(R/S/T/Z);
START:该 process 被触发启动的时间;
TIME:该 process 实际使用 CPU 运作的时间。
COMMAND:该进程的实际指令为何。

其他观察方法:

ps -lA
# 每个字段与 ps -l 相同,但显示的进程包括系统所有的进程

在这里插入图片描述

ps axjf
# 列出类似进程树的进程表示

在这里插入图片描述

ps aux | egrep '(cron|rsyslog)'
# 找出与 cron 与 rsyslog 这连个服务有关的PID号码

在这里插入图片描述

【僵尸(zombie)】成因是因为该进程应该已经执行完毕,或者是因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成那个进程一直存在内存当中。如果在某个进程的CMD后面还接上时,就代表该进程是僵尸进程啦,例如:
在这里插入图片描述
当系统不稳定的时候就容易造成所谓的僵尸进程,可能是因为程序写的不好啦,或者是使用者的操作习惯不良等等所造成。

事实上,通常僵尸进程都已经无法控管,而直接是交给 systemd 这支程序来负责了,偏偏 systemd 是系统第一支执行的程序,他是所有程序的父程序。我们无法杀掉该程序的(杀掉他,系统就死掉了! ),所以啰,如果产生僵尸进程,而系统过一阵子还没有办法透过核心非经常性的特殊处理来将该进程删除时,那只好透过 reboot 的方式来将该进程抹去了。

top:动态观察进程的变化
相对于 ps 是撷取一个时间点的进程状态,top 则可以持续侦测进程运作的状态。

top [-d 数字] | top [-bnp]
# -d:后面可以接秒数,就是整个进程画面更新的秒数,预设是5秒

在这里插入图片描述
在这里插入图片描述
第一行(top…):这一行显示的信息分别为:
目前的时间,亦即是15:55:40那个项目;
开机到目前为止所经过的时间,亦即是 up 36min,那个项目;
已经登入系统的用户人数,亦即是 2 users,项目;
系统在1,5,15分钟的平均工作负载。0.00,0.01,0.05;
第二行(Tasks…):显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie)。比较需要注意的是最后的 zombie 那个数值,如果不是0就是那个 process变成僵尸了。
第三行(%Cpus…):显示的是CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait,通常系统会变慢都是 IO 产生的问题比较大。因此这里得要注意这个项目耗用CPU的资源。另外,如果是多核心的设备,可以按下数字键【1】来切换成不同CPU 的负载率。
第四行与第五行:表示目前的物理内存与虚拟内存(Mem/Swap)的使用情况。要注意的是 swap 的使用量要尽量的少,如果 swap被用的很大量,表示系统的物理内存实在不足。
第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。

PID:每个process的ID;
USER:该process所属的使用者;
PR:Priority 的简写,进程的优先执行顺序,越小越早被执行;
NI:Nice的简写,与 Priority有关,也是越小越早被执行;
RCPU:CPU的使用率;
RMEM:内存的使用率;
TIME+:CPU使用时间的累加;

top 预设使用CPU使用率(%CPU)作为排序的重点,如果想要使用内存使用率排序,则可以按下【M】,若要回复则按下【P】即可。如果想要离开 top 则按下【q】。
如果想要将 top 的结果输出成为文件时,可以这样做:

top -b -n 2 > /tmp/top.txt

可以使用 top 观察特定PID的进程:
在这里插入图片描述

如果需要修改其中的某个值,按下 【R】 ,可以修改。。。

pstree
pstree 可以找进程之间的相关性。

pstree [-AIU] [-up]

在这里插入图片描述直接输入 pstree可以查到进程相关性,还会使用线段将相关性进程连结起来。一般链接符号可以使用ASCII 码即可,但有时因为语系问题会主动的以 Unicode 的符号来链接,但因为可能终端机无法支持该编码,或许会造成乱码问题。因此可以加上 -A 选项来克服此类线段乱码问题。
在这里插入图片描述
由 pstree 的输出也可以很清楚的知道,所有的进程都是依附在 systemd 这支进程底下的。
仔细看一下,这支进程的 PID 是 一号,因为他是由Linux核心所主动呼叫的第一支程序,所以PID就是一号了。
为啥发生僵尸进程需要重新启动?因为 systemd 要重新启动,而重新启动 systemd 就是 reboot。

进程的管理

进程之间是可以互相控制的。
进程互相管理是透过给予该进程一个讯号(signal)去告知该进程你想要让她作什么。
使用kill -l(小写的L)或者是 man 7 signal 都可以查询到有多少讯号,
主要的讯号代号与名称对应及内容是:
在这里插入图片描述
kill -signal PID
kill 将这个signal传送给某个工作(%jobnumber)或者是某个PID(直接输入数字)。
要再次强调的是: kill后面直接加数字与加上%number 的情况是不同的。因为工作控制中有 1 号工作,但是 PID1号则是专指【 systemd 】这支程序。
因此那个%是专门用在工作控制的。

killall -signal 指令名称
由于kill后面必须要加上PID(或者是 job number),所以,通常kill 都会配合ps, pstree等指令,因为我们必须要找到相对应的那个进程的ID.但是,如此一来,很麻烦~killall 可以利用【下达指令的名称】来给予讯号的。

killall [-iIe] [command name] 

在这里插入图片描述killall 可以将系统当中所有以某个指令名称启动的进程全部删除。

关于进程的执行顺序

Linux是多人多任务的环境,由t op 的输出结果我们也发现,系统同时间有非常多的进程在运行中,只是绝大部分的进程都在休眠(sleeping)状态而已。
如果所有的进程同时被唤醒,那么、就得要考虑到进程的优先执行序(Priority) 与CPU排程了。

CPU 排程与例行性工作排程并不一样。
CPU排程指的是每支进程被 CPU 运作的演算规则,而例行性工作排程则是将某支程序安排在某个时间再交由系统执行。CPU排程与操作系统较具有相关性。

Priority 与 Nice 值
CPU 一秒钟可以运作多达数 G 的微指令次数,透过核心的 CPU 排程可以让各进程被 CPU 所切换运作,因此每个进程在一秒钟内或多或少都会被CPU执行部分的脚本。

不具有优先级的进程按照顺序来:
在这里插入图片描述
具有优先级的进程,优先级较高的则运作次数可以较多次,不需要与较低优先级的进程抢位置:
在这里插入图片描述
这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的,用户无法直接调整 PRI 值的。
由于PRI是核心动态调整的,用户无权去干涉 PRI。如果想要调整进程的优先执行序时,就得要透过Nice值了。 Nice 值就是上状态栏中的 NI 。一般来说,PRI 与NI的相关性如下:
PRI(new) = PRI(old) + nice
因为PRI是系统【动态】决定的,所以,虽然 nice 值是可以影响PRI,不过,最终的 PRI 仍是要经过系统分析后才会决定的。另外,nice 值是有正负的,而既然 PRI越小越早被执行,所以,当 nice 值为负值时,那么该进程就会降低 PRI 值,亦即会变的较优先被处理。
nice值可调整的范围为 -20~19;
root可随意调整自己或他人进程的 Nice 值,且范围为-20 ~19;
一般使用者仅可调整自己进程的 Nice 值,且范围仅为0~19(避免一般用户抢占系统资源);
一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5,则未来仅能调整到大于5;
这也就是说,要调整某个进程的优先执行序,就是【调整该进程的 nice值】了。

给予某个进程 nice 值有两种方式,分别是:
1.一开始执行程序就立即给予一个特定的 nice 值:用nice指令;
2.调整某个已经存在的 PID 的 nice 值:用 renice 指令。

nice:新执行的指令即给予新的 nice 值

nice [-n 数字] command
# -n:后面接一个数值,数值的范围是 -20~19

将nice值调大的情况:系统的背景工作中,某些比较不重要的进程之进行:例如备份工作,由于备份工作相当的耗系统资源,这个时候就可以将备份的指令之 nice 值调大一些,可以使系统的资源分配的更为公平。

renice:已存在进程的 nice 重新调制

renice [number] PID
# PID : 某个进程的 ID,需要以ps或其它进程观察的指令去找出PID

系统资源的观察

free:观察内存使用情况

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

在这里插入图片描述在这里插入图片描述
Mem 那一行显示的是物理内存的量,Swap 则是内存置换空间的量。total 是总量,used 是已被使用的量,free 则是剩余可用的量。后面的 shared/buffers/cached 则是在已被使用的量当中,用来作为缓冲及快取的量,这些 shared/ buffers/cached 的用量中,在系统比较忙碌时,可以被释出而继续利用。因此后面就有一个 available(可用的)数值。

一般来说, swap 最好不要被使用,尤其 swap 最好不要被使用超过 20% 以上,如果发现 swap 的用量超过20%。那么,最好还是买物理内存来插吧,因为,Swap的效能跟物理内存实在差很多,而系统会使用到 swap,绝对是因为物理内存不足了才会这样做的。

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

uname [-asrmpi]

在这里插入图片描述在这里插入图片描述
uname 可以列出目前系统的核心版本、主要硬件平台以及CPU类型等等的信息。

uptime:观察系统启动时间与工作负载
uptime 可以显示 top 画面的最上面一行。
在这里插入图片描述

netstat:追踪网络或插槽文件
netstat 的输出分为两大部分,分别是网络与系统自己的进程相关性部分:

netstat -[atunlp]

在这里插入图片描述在这里插入图片描述
Proto:网络的封包协议,主要分为 TCP与 UDP 封包;
Recv-Q:非由用户程序链接到此 socket 的复制的总 bytes 数;
Send-Q:非由远程主机传送过来的 acknowledged 总 bytes 数;
Local Address:本地端的 IP:port 情况
Foreign Address:远程主机的 IP:port 情况
State:联机状态,主要有建立(ESTABLISED)及监听(LISTEN);

socket file 的输出字段有:
Proto:一般就是unix;
RefCnt:连接到此 socket 的进程数量;Flags:联机的旗标;
Type:socket 存取的类型。主要有确认联机的 STREAM 与不需确认的 DGRAM 两种;
State:若为 CONNECTED 表示多个进程之间已经联机建立。
Path:连接到此socket的相关程序的路径!或者是相关数据输出的路径。

dmesg:分析核心产生的讯息
系统在开机的时候,核心会去侦测系统的硬件,某些硬件到底有没有被捉到,就与这个时候的侦测有关。
所有核心侦测的讯息,不管是开机时候还是系统运作过程中,反正只要是核心产生的讯息,都会被记录到内存中的某个保护区段。dmesg 这个指令就能够将该区段的讯息读出来的!因为讯息实在太多了,所以执行时可以加入这个管线指令【more】来使画面暂停。

在这里插入图片描述
vmstat:侦测系统资源变化
vmstat 可以侦测【CPU/内存/磁盘输入输出状态】等等。

vmstat [-a] [延迟 [总计侦测次数]] # CPU/内存等信息
vmstat [-fs] # 内存相关
vmstat [-S 单位] # 设定显示数据的单位
vmstat [-d] # 与磁盘有关
vmstat [-p 分区槽] # 与磁盘有关

在这里插入图片描述
统计目前主机CPU状态,每秒一次,共计三次:
在这里插入图片描述
进程字段(procs)的项目分别为:
r:等待运作中的进程数量;b:不可被唤醒的进程数量。这两个项目越多,代表系统越忙碌(因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒之故)。
内存字段(memory)项目分别为:
swpd:虚拟内存被使用的容量;free:未被使用的内存容量;buff:用于缓冲存储器;cache:用于高速缓存。这部份则与 free 是相同的。
内存置换空间(swap)的项目分别为:
si:由磁盘中将进程取出的量;so:由于内存不足而将没用到的进程写入到磁盘的 swap 的容量。如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差。
磁盘读写(io)的项目分别为:
bi:由磁盘读入的区块数量;bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌。
系统(system)的项目分别为:
in:每秒被中断的进程次数;cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的沟通非常频繁,这些接口设备当然包括磁盘、网络卡、时间钟等。
CPU的项目分别为:
us:非核心层的CPU使用状态;sy:核心层所使用的CPU状态;id:闲置的状态;wa:等待 I/O 所耗费的 CPU 状态;st:被虚拟机(virtual machine)所盗用的CPU使用状态(2.6.11 以后才支持)。

系统上所有的磁盘的读写状态:
在这里插入图片描述

特殊文件与进程

具有 SUID/SGID 权限的指令执行状态

SUID 的权限其实与进程的相关性非常的大
SUID 的程序是如何被一般用户执行,且具有什么特色呢?
-SUID权限仅对二进制程序(binary program)有效;
-执行者对于该程序需要具有 x 的可执行权限;
-本权限仅在执行该程序的过程中有效(run-time);
-执行者将具有该程序拥有者(owner)的权限。

所以说,整个SUID的权限会生效是由于【具有该权限的程序被触发】,而一个程序被触发会变成进程,所以执行者可以具有程序拥有者的权限就是在该程序变成进程的那个时候。
执行了passwd 后就具有root 的权限:因为在触发 passwd后,会取得一个新的进程与 PID,该 PID 产生时透过 SUID 来给予该 PID 特殊的权限设定。
SUID程序运作过程中产生进程.

/proc/* 代表的意义

所谓的进程都是在内存当中,而内存当中的数据又都是写入到 /proc/* 这个目录下的,所以可以直接观察/proc 这个目录当中的文件。
在这里插入图片描述
基本上,目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc 当中。

在这里插入图片描述cmdline:这个进程被启动的指令串,就是这个指令、选项与参数启动systemd;
environ:这个进程的环境变量内容。

查询已开启文件或已执行进程开启的文件

fuser:由文件(或文件系统)找出正在使用该文件的进程
可以利用 fuser 来观察进程到底在这次启动过程中开启了多少文件。

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

在这里插入图片描述找出目前所在目录的使用 PID/所属账号/权限:
在这里插入图片描述
ACCESS(权限)代表的意义:
c:此进程在当前的目录下(非次目录);
e:可被触发为执行状态;
f:是一个被开启的文件;
r:代表顶层目录( root di rectory);
F:该文件被开启了,不过在等待回应中;
m:可能为分享的动态函式库;

透过这个 fuser 可以找出使用该文件、目录的进程,它的重点与 ps, pstree不同。fuser 可以让我们了解到某个文件(或文件系统)目前正在被哪些进程所利用。

lsof:列出被进程所开启的文件档名
相对于 fuser 是由文件或者装置去找出使用该文件或装置的进程,反过来说,lsof 可以查出某个进程开启或者使用的文件与装置。

lsof [-aUu] [+d]

在这里插入图片描述
在这里插入图片描述
在预设的情况下,lsof会将目前系统上面已经开启的。
文件第一个文件 systemd 执行的地方就在根目录,而根目录所在的 inode 也有显示出来。

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

pidof [-sx] program_name

在这里插入图片描述在这里插入图片描述

《鸟哥的Linux私房菜-基础篇》学习笔记

《鸟哥的Linux私房菜-基础篇》学习笔记

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

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

相关文章

JDK 历史版本下载以及指定版本应用

参考: 官网下载JAVA的JDK11版本(下载、安装、配置环境变量)_java11下载-CSDN博客 Gradle:执行命令时指定 JDK 版本 - 微酷网 下载 打开官网地址 Java Downloads | Oracle 当前版本在这里,但是我们要下载历史版本 选…

vue3 + TS 项目中使用pinia-plugin-persistedstate持久化缓存

Vue 3和Pinia是一对非常好的组合,可以帮助你构建现代化的Vue应用程序。而pinia-plugin-persistedstate是一个用于在Pinia存储中实现状态持久化的插件。下面我将详细介绍如何在Vue 3应用程序中使用Pinia和pinia-plugin-persistedstate模块。 首先,确保你…

[C++]priority_queue的介绍及模拟实现

目录 priority_queue的介绍及模拟实现:: priority_queue的介绍 priority_queue的定义方式 priority_queue各个接口的使用 堆的向上调整算法 堆的向下调整算法 仿函数 priority_queue的模拟实现 反向迭代器的底层原理 反向迭代器的模拟实现 priority_que…

SWD和JTAG

1、调试接口概念 1)SWD:Serial Wire Debug,代表串行线调试,是ARM设计的协议,用于对其微控制器进行编程和调试。 SWD 引脚: SWDIO–串行数据线,用于数据的读出和写入SWDCLK–串行时钟线&#…

前端开发_CSS

CSS定义 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容) 书写位置:title 标签下方添加 style 双标签,style 标签里面书…

内外网转换NAT

目录 分类 内核参数配置文件 SNAT 网关服务器配置 配置内网主机 配置外网主机 配置SNAT 内网主机测试 DNAT 配置网关服务器 支持的规则链:INPUT、OUTPUT、PREROUTING、POSTROUTING 分类 SNAT(将外网设备共享给内网) source NAT &a…

关于rocketMQ踩坑的那些事

在最近,我所写的这个项目需要使用到rocketMQ,为了图方便我便使用的是Windows版本的,但是在使用的过程中首先是发现无法发送消息出去,报错信息为 org.apache.rocketmq.client.exception.MQClientException: Send [3] times, still …

分布式搜索引擎elasticsearch(二)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查…

Spring Bean的生命周期各阶段详解附源码

目录 Bean的生命周期Bean定义阶段Bean实例化阶段Bean属性注入阶段Bean初始化阶段Bean销毁阶段 Bean的生命周期 bean的生命周期,我们都知道大致是分为:bean定义,bean的实例化,bean的属性注入,bean的初始化以及bean的销毁…

基础课14——语音识别

ASR 是自动语音识别(Automatic Speech Recognition)的缩写,是一种将人类语音转换为文本的技术。ASR 系统可以处理实时音频流或已录制的音频文件,并将其转换为文本。它是一种自然语言处理技术,广泛应用于许多领域&#…

卷积神经网络(CNN):乳腺癌识别.ipynb

文章目录 一、前言一、设置GPU二、导入数据1. 导入数据2. 检查数据3. 配置数据集4. 数据可视化 三、构建模型四、编译五、训练模型六、评估模型1. Accuracy与Loss图2. 混淆矩阵3. 各项指标评估 一、前言 我的环境: 语言环境:Python3.6.5编译器&#xf…

VQD视频质量诊断服务/图像质量诊断/视频流质量诊断/传统方法与深度学习结合的视频质量诊断

随着平安城市、大安防的发展,监控摄像机数量的不断增加,给监控系统的维护工作带来了新的挑战。如何及时了解前端视频设备的运行情况,发现故障并检测恶意遮挡与破坏的不法行为已成为视频监控系统运行的首要迫切问题。对于成千上万个监控摄像机…

TCP 半连接队列和全连接队列

在 TCP 三次握手的时候,Linux 内核会维护两个队列,分别是: 半连接队列,也称 SYN 队列; 全连接队列,也称 accept 队列; 服务端收到客户端发起的 SYN 请求后,内核会把该连接存储到半连…

java 多种验证码

java 多种验证码 1.SpringBoot 引入jar包2. java 导入jar包3. 代码4. 效果图 1.SpringBoot 引入jar包 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dep…

Spring Boot中使用Swagger

1. 启用Swagger 1.1 启用注解扫描和文档接口 直接在POM文件引入依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency>1.2 启动swagger-u…

【Windows下】Eclipse 尝试 Mapreduce 编程

文章目录 配置环境环境准备连接 Hadoop查看 hadoop 文件 导入 Hadoop 包创建 MapReduce 项目测试 Mapreduce 编程代码注意事项常见报错 配置环境 环境准备 本次实验使用的 Hadoop 为 2.7.7 版本&#xff0c;实验可能会用到的文件 百度网盘链接&#xff1a;https://pan.baidu…

Shopee过期的折扣活动如何删除?Shopee促销商品如何下架?——站斧浏览器

商家们可以轻松删除虾皮过期活动以及下架促销商品&#xff0c;保持店铺的整洁和顾客的购物体验。那么shopee过期的折扣活动如何删除&#xff0c;shopee促销商品如何下架。 Shopee过期的折扣活动如何删除&#xff1f; 在删除虾皮过期活动时&#xff0c;商家们需要遵循以下步骤…

Deployment脚本部署Tomcat集群:外部访问、负载均衡、文件共享及集群配置调整

文章目录 前置知识一、Deployment脚本部署Tomcat集群二、外部访问Tomcat集群三、利用Rinted对外提供Service负载均衡支持1、创建服务2、端口转发工具Rinetd3、定义jsp文件查看转发到哪个节点 四、部署配置挂载点五、基于NFS实现集群文件共享1、master2、node3、验证 六、集群配…

Linux 进程

文章目录 进程定义进程的描述查看进程方法进程状态进程优先级进程相关概念补充 进程定义 大多数的说法&#xff1a;进程是计算机中正在运行的程序的实例。它是操作系统对程序的一种抽象&#xff0c;用于管理和调度程序的执行。 个人理解: 从OS(操作系统)开始说起&#xff0c;…

用户态和内核态

实际上任何Linux发行版(Centos/RedHat....)&#xff0c;其系统内核都是Linux。我们的应用都需要通过Linux内核与硬件交互。为了避免用户应用导致冲突甚至内核崩溃&#xff0c;用户应用与内核是分离的&#xff1a; 进程的寻址空间会划分为两部分&#xff1a;内核空间、用户空间。…