Linux(14):进程管理

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

进程

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

进程与程序

【执行一个程序或指令】就可以触发一个事件而取得一个 PID。
文件和目录的权限由三个部分组成:所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限(r/w/x)。
【不同的使用者身份执行同一个 program 时,系统给与的权限并不相同】
Linux(14):进程管理_第1张图片
如上图所示,程序一般是放置在实体磁盘中,然后透过用户的执行来触发。触发后会加载到内存中成为一个个体,那就是进程。为了操作系统可管理这个进程,因此进程有给予执行者的权限/属性等参数,并包括程序所需要的脚本与数据或文件数据等,最后再给予一个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 环境下,就称为【父进程】。
Linux(14):进程管理_第2张图片
程序彼此之间是有相关性的,连续执行两个 bash 后,第二个bash的父进程就是前一个bash。
因为每个进程都有一个PID,那某个进程的父进程可以透过 Parent PID(PPID)来判断。

fork and exec:进程呼叫的流程
子进程与父进程之间最大的复杂点在于进程互相之间的呼叫。
在 Linux 的进程呼叫通常称为 fork-and-exec 的流程:进程都会由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
Linux(14):进程管理_第3张图片
(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]

Linux(14):进程管理_第4张图片如果想要知道目前有多少的工作在背景当中,一般来说,直接下达 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

Linux(14):进程管理_第5张图片特别留意,-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 #连同部分进程树状态

Linux(14):进程管理_第6张图片一个是只能查阅自己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
Linux(14):进程管理_第7张图片
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 相同,但显示的进程包括系统所有的进程

Linux(14):进程管理_第8张图片

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

Linux(14):进程管理_第9张图片

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

在这里插入图片描述

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

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

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

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

Linux(14):进程管理_第10张图片
Linux(14):进程管理_第11张图片
第一行(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的进程:
Linux(14):进程管理_第12张图片

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

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

pstree [-AIU] [-up]

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

进程的管理

进程之间是可以互相控制的。
进程互相管理是透过给予该进程一个讯号(signal)去告知该进程你想要让她作什么。
使用kill -l(小写的L)或者是 man 7 signal 都可以查询到有多少讯号,
主要的讯号代号与名称对应及内容是:
Linux(14):进程管理_第15张图片
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] 

Linux(14):进程管理_第16张图片killall 可以将系统当中所有以某个指令名称启动的进程全部删除。

关于进程的执行顺序

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

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

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

不具有优先级的进程按照顺序来:
Linux(14):进程管理_第17张图片
具有优先级的进程,优先级较高的则运作次数可以较多次,不需要与较低优先级的进程抢位置:
Linux(14):进程管理_第18张图片
这个 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]

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

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

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

uname [-asrmpi]

Linux(14):进程管理_第20张图片在这里插入图片描述
uname 可以列出目前系统的核心版本、主要硬件平台以及CPU类型等等的信息。

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

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

netstat -[atunlp]

Linux(14):进程管理_第21张图片Linux(14):进程管理_第22张图片
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】来使画面暂停。

Linux(14):进程管理_第23张图片
vmstat:侦测系统资源变化
vmstat 可以侦测【CPU/内存/磁盘输入输出状态】等等。

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

Linux(14):进程管理_第24张图片
统计目前主机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 这个目录当中的文件。
Linux(14):进程管理_第25张图片
基本上,目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc 当中。

Linux(14):进程管理_第26张图片cmdline:这个进程被启动的指令串,就是这个指令、选项与参数启动systemd;
environ:这个进程的环境变量内容。

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

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

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

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

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

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

lsof [-aUu] [+d]

Linux(14):进程管理_第28张图片
Linux(14):进程管理_第29张图片
在预设的情况下,lsof会将目前系统上面已经开启的。
文件第一个文件 systemd 执行的地方就在根目录,而根目录所在的 inode 也有显示出来。

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

pidof [-sx] program_name

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

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

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

你可能感兴趣的:(操作系统,linux,运维,服务器)