文章目录
一、进程
(一)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执行 |
NI | Nice值,可通过修改其值调整进程的优先级 |
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 id | CPU空闲时间占用CPU总时间的百分比 |
0.0 wa | 等待I/O的进程占用的CPU百分比 |
0.0 hi | 硬中断请求服务占用的CPU百分比 |
0.0 si | 软中断请求服务占用的CPU百分比 |
0.0 st | st (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执行 |
NI | Nice值,数值越小,优先级越高 |
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 命令查看所有信号及其编号。
常用信号:
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化 |
2 | INT | 表示结束进程,但并不是强制性的,常用的“Ctrl+C”组合键发出就是一个kill -2的信号 |
3 | QUIT | 退出 |
9 | KILL | 杀死进程,即强制结束进程 |
11 | SEGV | 段错误 |
15 | TERM | 正常结束进程,是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:每秒进行的事件切换次数。这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: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资源的短缺。