进程管理

一、进程

(一)Linux程序与进程

程序是一组指令及参数的集合按照既定的逻辑控制计算机运行用来完成特定的任务

进程则是运行着程序,是操作系统执行的基本单元,是程序运行的过程,动态。有生命周期及运行状态

》》》从用户的角度来看进程是程序的一次动态执行过程。
》》》从操作系统的核心来看,进程是操作系统分配的内存、CPU时间片等资源的基本单位。
》》》进程是资源分配的最小单位。
》》》每一个进程都有自己独立的地址空间和执行状态。
》》》像Linux这样的多任务操作系统能够让许多程序同时运行,每一个运行着的程序就构成了一个进程。

1、程序和进程的区别

》》程序是静态的,它只是一组指令的集合,不具有任何的运行意义。而进程是程序运行的动态的过程。
》》进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程。
》》进程还具有并发性和交互性,而程序却是封闭的。

2、进程和线程的区别

》》一个进程可以拥有多个线程,但至少一个线程,而一个线程只能在一个进程的地址空间内活动。
》》资源分配给进程,同一个进程的所有线程共享该进程的所有资源。
》》CPU分配给线程,即真正在处理器运行的是线程。
》》线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。

进程生命周期在这里插入图片描述
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。PID和父进程ID(PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

3、父子进程的关系

子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程。在Linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。父进程终止子进程自终止。

子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量、以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的代码。

三、进程管理工具

(一)ps命令

ps命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息

用法:ps[选项]
选项
-A: 所有的进程均显示出来,与-e具有同样的效用;
-a: 只显示现行终端机下的所有进程,包括其他用户的进程;
-u:以用户为主的进程状态(也可不加-)
x:显示没有控制终端的进程;
-e:显示所有进程

输出格式选项:
l: 较长、较详细的将该PID的信息列出(也可不加-)
j: 工作的格式(jobs format)
-f:做一个更为完整的输出。

可以看到,ps命令有些与众不同,它的部分选项不能加入“-”,比如命令“ps aux”,其中“aux”是选项,但是前面不能带“-”。

执行“man ps”命令,则会发现ps命令的帮助为了适应不同的类UNIX系统,可用格式非常多,不方便记忆。所以,建议大家记忆几个固定选项即可。比如:
ps aux可以查看系统中的所有进程;
ps -le可以查看系统中所有的进程,而且还能看到进程的父进程的PID和进程优先级;
ps -l只能看到当前Shell产生的进程;
【例一】
ps aux 查看系统中所有的进程
在这里插入图片描述

说明以上输出信息中各列的具体含义:

表头含义
F进程标志,说明进程的权限,常见的标志有两个。1:进程可以被复制,但不能执行 4:进程使用超级用户权限
S进程状态,和ps aux命令输出内容中的STAT一致
UID运行此进程的用户ID
PID进程的ID
PPID父进程的ID
C该进程的CPU使用率,单位是百分比
PRI进程的优先级,数值越小该进程的优先级越高,越早被CPU执行
NINice值,可通过修改其值调整进程的优先级
ADDR该进程在内存的哪个位置
SZ该进程占用的内存大小
WCHAN该进程是否在运行。“-”代表在运行
TTY该进程在哪个终端上运行
TIME该进程占用CPU的时间,不是系统时间
CMD产生此进程的命令名

【例三】如果不想看到所有的进程,只想查看一下当前shell产生了哪些 进程,那只需要使用“ps -l”命令就足够了
在这里插入图片描述
可以看到,是在pts/1伪终端登录,且只产生了两个进程:一个是登录之后生成的shell,也就是bash;另一个是正在执行的ps命令

【例四】
查找指定进程的指定信息并进行排序
在这里插入图片描述
僵尸进程的产生一般是由于进程非正常停止或程序编写错误,导致子进程先于父进程结束,而父进程又没有正确的回收子进程,从而造成子进程一直存在与内存当中,这就是僵尸进程。僵尸进程会对主机的稳定性产生影响,所以,在产生僵尸进程后,一定要对产生僵尸进程的软件进行优化,避免一直产生僵尸进程;对于已经产生的僵尸进程,可以在查找出来之后强制终止。

(二)pstree

以树形结构显示程序和进程之间的关系(即哪个进程是父进程,哪个是子进程)

**用法:**pstree[options] [ PID | USER]

选项:
-A:各进程树之间的连接以ASCII码字符来连接

-U:各进程树之间的连接以utf8字符来连接,某些终端可能会错误

-p:同时列出每个进程的PID

-u:同时列出每个进程的所属账号名称

-a:显示启动每个进程对应的完整指令,包括启动进程的路径,参数等

-c:不使用精简法显示进程信息,即显示的进程中包含子进程和父进程

-n:根据进程PID号来排序输出,默认是以程序名排序输出的

需要注意的是:
在使用pstree命令时,如果不指定进程的PID号,也不指定用户名称,则会以systemd进程为根进程,显示系统中所有程序和进程的信息;反之,若指定PID号或用户名,则将以PID或指定命令为根进程,显示PID或用户对应的所有程序和进程。

【例一】
在这里插入图片描述
【例二】
查看指定用户或PID启动的进程
在这里插入图片描述

(三)top命令

实时监控系统处理器状态的命令 top
ps命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行ps命令,这显然是缺乏效率的。

为此,Linux提供了top命令。top命令可以动态地持续监听进程的运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了解了进程的运行状态。
**通过top命令查看系统的CPU,内存,运行时间,交换分区,执行的线程等信息。**通过top命令可以有效的发现系统的缺陷在哪里。是内存不够、CPU处理能力不够、IO读写过高…

用法:top[选项]

选项:
-d 秒数:指定top命令每隔几秒更新。默认是3秒;
-b:使用批处理模式输出。一般和“-n”选项合用,用于把top命令重定向到文件中;
-n次数:指定top命令执行的次数。一般和“-”选项合用;
-p进程PID:仅查看指定ID的进程;
-s:使top命令在安全模式中运行,避免在交互模式中出现错误;
-u用户名:只监听某个用户的进程;
-o[+/-]filedname:以表头的某个选项排序,+代表所有进程根据该选项从大到小排序(+是默认的,-代表从大到小排序)

在top命令的显示窗口中,还可以使用如下按键,进行交互操作:
?或h:显示交互模式的帮助;
P:按照CPU的使用率排序,默认就是此选项;
M:按照内存的使用率排序;
N:按照PID排序;
T:按照CPU的累积运算时间排序,也就是按照TIME+项排序;
k:按照PID给予某个进程一个信号。一般用于中止某个进程,信号9是强制中止的信号;
r:按照PID给某个进程重设优先级(Nice)值;
q:退出top命令;

我们看看top命令的执行结果,如下:
在这里插入图片描述
说明输出内容:
top命令的输出内容是动态的,默认每隔3秒刷新一次。命令的输出主要分为三部分:
1、第一部分是前五行,显示的是整个系统的资源使用情况,我们就是通过这些来判断服务器的资源使用状态的;
2、第二部分是第六行,提供人机交互;
3、第三部分从第七行开始,显示的是系统中进程的信息;

第一部分信息的含义:

第一行为任务队列信息

内容说明
10:29:47当前系统时间
up 1:13系统的运行时间。本机以运行1小时13分钟
2 users当前登录了两个用户
load average:0.00,0.01,0.05系统在之前1分钟、5分钟、15分钟的CPU平均负载(这个平均负载一般认为不应该超过服务器CPU的核数)

第二行为进程信息

内容说明
TASK:131 total系统中的进程总数
1 running正在运行的进程数
130 sleeping睡眠的进程数
0 stopped正在停止的进程数
0 zombie僵尸进程数

第三行为CPU信息

内容说明
%Cpu(s)CPU百分比
0.1 us用户模式占用的CPU百分比
0.1 sy系统模式占用的CPU百分比
0.0 ni修改过优先级的用户进程占用的CPU百分比
99.8 idCPU空闲时间占用CPU总时间的百分比
0.0 wa等待I/O的进程占用的CPU百分比
0.0 hi硬中断请求服务占用的CPU百分比
0.0 si软中断请求服务占用的CPU百分比
0.0 stst (steal time)意为虚拟时间百分比。被hypervisor(虚拟化层,虚拟机监控器)偷去的时间,实现虚拟化的程序占用CPU时间的百分比

第四行为物理内存信息

内容说明
KiB Mem物理内存信息,单位:KB
1863040 total物理内存的总量
1527264 free空闲的物理内存大小
192192 used已经使用的物理内存大小
143584 buff/cache缓冲区/缓存的物理内存大小

第五行为交换(swap)分区信息

内容说明
KiB Swap交换分区(虚拟内存)信息,单位:KB
3907580 total交换分区的总大小
3907580 free空闲交换分区的大小
0 used已经使用的交换分区的大小
1519428 avail Mem可以使用的交换分区大小(一般近似为交换分区总大小的30%)

可以使用cat /proc/sys/vm/swappinessx来查看可以使用的交换分区大小的百分比:
在这里插入图片描述
通过 top 命令的第一部分就可以判断服务器的健康状态。如果 CPU 是单核的, 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。

这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存)等

缓冲(buffer)和缓存(cache)的区别:

缓存(cache) 是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
缓冲区(buffer) 是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。

简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

内容说明
PID进程的ID
USER该进程所属的用户
PR优先级,数值越小优先级越高,越先被CPU执行
NINice值,数值越小,优先级越高
VIRT该进程使用的虚拟内存的大小,单位为KB
RES该进程使用的物理内存的大小,单位为KB
SHR共享内存大小,单位为KB
S进程状态
%CPU该进程占用CPU的百分比
%MEM该进程占用内存的百分比
TIME+该进程共占用的CPU时间
COMMAND进程的命令名

这部分和ps命令的输出比较类似,只是如果在终端执行top命令,则不能看到所有的进程,而只能看到占比靠前的进程。

【例一】
如果只想让 top 命令查看某个进程,就可以使用“-p”选项。命令如下:
在这里插入图片描述
【例二】
top 命令如果不正确退出,则会持续运行。在 top 命令的交互界面中按 “q” 键会退出 top 命令;也可以按 “?” 或 “h” 键得到 top 命令交互界面的帮助信息。在帮助信息中可以看到更多的在交互界面对应按键功能和作用,这里只介绍几个比较常用的:
(1)
【k】键:可以终止某个进程

在这里插入图片描述
Tips:输入错误,想退格删除,可以使用【Ctrl+Backspace】组合键进行删除

输入你想要终止的进程号,回车后在该交互行会出现以下信息:
在这里插入图片描述
此时是top 命令提示我们输入信号(信号 9 代表强制中止,15代表正常终止),回车执行(不输入直接执行为默认正常终止,因为该进程是系统进程正常终止是不行的必须强制终止)

【例三】
指定 top 命令每隔1秒更新(默认是 3 秒)
在这里插入图片描述
【例四】
指定 top 命令更新3次后就退出
在这里插入图片描述
【例五】
指定 top 命令只显示dxk用户的进程信息(伪用户也可以)
在这里插入图片描述
【例六】
查看看指定进程(PID)的信息
在这里插入图片描述
【例七】
将进程按照表头项中的任何一个进行排序显示
在这里插入图片描述
【例八】
如果在操作终端执行 top 命令,则并不能看到系统中所有的进程,默认看到的只是 CPU 占比靠前的进程。如果我们想要看到所有的进程,则可以把 top 命令的执行结果重定向到文件中。不过 top 命令是持续运行的,这时就需要使用 “-b” 和 “-n” 选项。
具体命令如下:
在这里插入图片描述

(四)pgrep

经常要查看进程的信息,包括进程是否已经消亡,通过pgrep来获得正在被调度的进程的相关信息。pgrep通过匹配其进程名,找到匹配的进程

用法: pgrep [options]

选项:
-l : 同时显示进程名和PID
-o:当匹配多个进程时显示进程号最小的那个
-n:当匹配多个进程时,显示进程号大的那个
注:进程号越大,并不一定意味着进程的启动时间越晚

【例一】
默认只显示PID
在这里插入图片描述
同时显示PID和进程名称
在这里插入图片描述
【例二】
当匹配多个进程时,显示进程号最小的那个
在这里插入图片描述
当匹配多个进程时,显示进程号最大的那个
在这里插入图片描述
pgrep命令用来查找进程的信息,通常会和kill命令来连用,在指定条件下kill问题进程。

(五)kill

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

执行原理: kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。kill命令是通过向进程发送指定的信号来结束相应进程的。

用法: kill [-SIGNAL] PID

选项:
-l [SIGNAL]:查询指定信号(信号编号)的信号编号(信号),若使用“-l”参数会列出全部的信号名称
-P:指定kill命令只打印相关进程的进程号,而不发送任何信号
-SIGNAL:指定发送信号

kill命令是按照PID来确定进程的,所以kill命令只能识别PID,而不能识别进程名。Linux定义了几十种不同类型的信号,可以使用kill -l 命令查看所有信号及其编号。
在这里插入图片描述
常用信号:

信号编号信号名含义
0EXIT程序退出时收到该信息
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化
2INT表示结束进程,但并不是强制性的,常用的“Ctrl+C”组合键发出就是一个kill -2的信号
3QUIT退出
9KILL杀死进程,即强制结束进程
11SEGV段错误
15TERM正常结束进程,是kill命令的默认信号

说明:只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用 ps/pidof/pstree/top 等工具获取进程PID,然后使用kill命令来杀掉该进程

在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。

【例 1】
查询信号
在这里插入图片描述
列出所有信号所对应的信号编号:
在这里插入图片描述
【例2】
向进程发送特定的信号

结束方式
在这里插入图片描述
它的效果等同于在前台运行PID为21189的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号

强行终止进程
在这里插入图片描述
【例3】
kill命令可以带信号编号选项,也可以不带。如果没有信号编号,kill命令就会默认发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源
在这里插入图片描述
【例4】
kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息
在这里插入图片描述
【例5】
向多个进程发信号或终止它们
在这里插入图片描述
可以看到所有httpd进程竟然都结束了,一般而言相同程序名的进程号中最小的是父进程,其余为子进程,结束了父进程那么自然而然子进程也就必须结束

【例 6】
当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下
Enter键使shell的命令提示符再次出现时,才会显示出来
在这里插入图片描述

(六)killall

killall也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程

使用kill命令杀死指定PID进程时,首先需要在杀死之前使用ps、pstree、top等命令配合grep来查找进程,而killall把这两个过程合二为一

用法:killall [选项] [信号] 进程名

选项:
-u:杀死指定用户的所有进程
-l:忽略小写
-g:杀死进程组而不是进程
-i:交互模式,杀死进程前先询问用户
-I(大i):列出所有的已知信号名称
-q:不输出警告信息
-s[SIGNAL]:发送指定的信号,等价于-SIGNAL
-v:报告信息是否成功发送
-w:等待进程死亡

此命令的信号类型和使用同kill命令

【例一】
杀死指定用户进程
在这里插入图片描述
【例二】
忽略大小写
在这里插入图片描述
【例三】
交互式
在这里插入图片描述
【例四】
发送信号
在这里插入图片描述
【例五】
在这里插入图片描述
【例六】
在这里插入图片描述
【例七】
在这里插入图片描述

(七)pkill

pkill是ps命令和kill命令的结合,按照进程名来发送指定信号给进程,pkill和killall应用方法差不多

**用法:**pkill [SIGNAL] 进程名

信号和kill及killall相同

【例一】
发送指定信号(同killall)
在这里插入图片描述【例二】
pkill命令踢出登录用户,即按照终端号来踢出用户登录

[-t 终端号]选项用于按照终端号踢出用户

通过 killall 命令杀死 sshd 进程的方式来踢出用户,非常容易误杀死进程,要么会把 sshd 服务杀死,要么会把自己的登录终端杀死。

所以,不管是使用 kill 命令按照 PID 杀死登录进程,还是使用 killall 命令按照进程名杀死登录进程,都是非常容易误杀死进程的,而使用 pkill 命令则不会
在这里插入图片描述

四、查看系统资源的使用状况vmstat

动态的了解系统资源的使用状况,以及查看当前系统中到底是哪个环节最占系统资源

vmstat命令,是Virtual Meomory Statisics (虚拟内存统计)的缩写,可用来监控CPU使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息

用法:
在这里插入图片描述
选项:
-a:显示活跃和非活跃内存
-f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的
-s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。
-d:列出硬盘有关读写总量的统计表。
-p:分区设备文件名 查看硬盘分区的读写情况。
-D:显示磁盘总体信息
-n:只在开始时显示一次各字段名称
在这里插入图片描述

各个字段输出含义:

字段含义
procs进程信息字段:r: 等待运行的进程数,数量越大,系统越繁忙。b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory内存信息字段:swpd:虚拟内存的使用情况,单位为 KB。free:空闲的内存容量,单位为 KB。buff:缓冲的内存容量,单位为 KB。cache:缓存的内存容量,单位为 KB。
swap交换分区信息字段:si:从磁盘中交换到内存中数据的数量,单位为 KB。so:从内存中交换到磁盘中数据的数量,单位为 KB。这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
io磁盘读/写信息字段:bi:从块设备中读入的数据的总量,单位是块。bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。
system系统信息字段:in:每秒被中断的进程次数。cs:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。
cpuCPU信息字段:us:非内核进程消耗 CPU 运算时间的百分比。sy:内核进程消耗 CPU 运算时间的百分比。id:空闲 CPU 的百分比。wa:等待 I/O 所消耗的 CPU 百分比。st:被虚拟机所盗用的 CPU 百分比。

常见问题处理:
如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。
如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。
如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值