第六章 进程管理与系统监控
一个具有较好的安全性和稳定性的系统是用户所需要的。无论进行何种操作和业务处理,用户都希望系统始终处于安全、稳定的状态。因此,即时地进行系统的进程管理和系统监控工作是保证系统安全、稳定的状态。
1.进程管理
1.1.什么是进程
进程的概念最早出现在20世纪60年代,此时操作系统已经进入多道程序设计的时代。程序的并发执行不仅提高了系统的执行效率,也带来了资源利用率的极大提高。与此同时,并发程序的执行,在操作系统中引入了进程的概念。
进程(process)通常被定义为可并发执行的、具有一定功能的程序段在给定数据集上的一次执行过程。简而言之,进程就是程序的一次运行过程。
进程具有以下几个基本特征:
- **动态性:**进程的实质是程序的此役执行过程,因此,动态性是进程最基本的特征。它由创建而产生,由调度而执行,由撤销而消亡。可见,进程具有一定的生命周期。而程序只是一组有序指令的集合,并存放于某种介质上,本身并无运动的含义,因此是静态的。
- **并发性:**多个进程能在一段时间内同时运行。并发性是进程的重要特征。引入进程的目的也正是为了使用程序能和其他进程的程序并发执行。而程序(没有建立进程时)是不能作为一个独立的单位参加运行的。只有进程有资格向系统申请资源并获得系统提供的服务。
- **独立性:**进程是一个能独立运行、独立分配资源和独立调度的基本单位,凡未建立进程的程序,都不能作为一个独立的单位参加运行。只有进程有资格向系统申请资源并获得系统提供的服务。
- **异步性:**进程按各自独立的、不可预知的速度向前推进,或者说进程按异步方式运行。
- **结构性:**为使进程能独立运行,应为之配置一个称为进程控制块(Process Contgrol Block,PCB)的数据结构。从结构上看,进程由程序段、数据段和PCB这3部分组成,UNIX把这3部分称为进程映象。
1.2.进程的基本状态及其转换
进程在启动后不一定马上运行,因而进程存在很多种状态。从理论上讲,进程通常会在三种状态之间进行转换:运行态、就绪态、等待态(阻塞态):
- **运行态:**运行态指当前进程已分配到CPU,正在处理器上执行的状态,处于运行态进程的个数不能大于CPU的数目,在一般单CPU环境中,任何时刻处于运行态的进程只能有一个。
- **就绪态:**就绪态指进程已具备运行的条件,但因为其他进程正占用CPU,所以暂时不能运行而等待CPU的状态。一旦把CPU分给它,立即就可以运行,在操作系统上,处于运行态的进程可以有多个。
- **阻塞态:**阻塞态指进程因等待某种事件(如等待某一输入、输出操作完成,等待其他进程发来信号等)而暂时不能运行的状态。此时即使CPU处于空闲,阻塞态的进程也不能运行,系统中处于阻塞态的进程也可以是多个。当阻塞态进程所要等待的事件发生后,就会转入就绪态。
具体到Linux系统中,进程所处的状态更为复杂多样,系统为每种状态都定义了一个符号,以便更好的标记:
- **可运行状态R:**处于这种状态的进程,要么正在运行,要么正准备运行。也就是说,理论上处于运行态和就绪态的进程,在Linux中都被视为可运行状态。
- **可中断的等待状态S:**这类进程处于等待状态,一旦达到某种条件就会变为就绪态。
- **不可中断的状态D:**与”可中断的状态“的定义基本类似,唯一不同的是处于这个状态的进程对中断信号不做相应。比如某个进程正在从硬盘向内存中读入大量的数据时就会处于这种状态。
- **僵死状态Z:**正常情况下子进程应该由父进程结束,并释放其所占的系统资源。当某个进程已经运行结束,但是它的父进程还没有释放系统资源时,这个进程就会处于僵死状态。
- **暂停状态T:**此时的进程暂停于内存中,但不会被调度,等待接收某种特殊的处理。
1.3.进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个数据结构,该数据结构被称为进程控制块(PCB)。所谓系统创建一个进程,就是由系统为某个程序设置一个PCB,用于对该进程进行控制和管理。进程任务完成后,由系统收回PCB,该进程便小王。系统根据PCB来告知相应进程的存在,因此PCB是进程存在的唯一标志。
PCB中包含了进程的描述信息和控制信息。PCB的内同主要包括了描述信息、现场信息和控制及资源管理信息。
- **描述信息:**这一部分信息量的多少由操作系统的设计者决定。主要包括进程标识号和家族关系。
- 进程标识号:用于唯一标识一个进程,包括内部标识号和外部标识号。在所有的操作系统中,都为每个进程赋予一个唯一的数字标识号,它通常是一个进程的序号。因此,设置内部标识号主要是为了方便系统使用。外部标识号是由创建者提供的,通常是数字、字母所组成,往往供用户(进程)在房屋内该进程时使用。
- 家族关系:用于说明本进程与其他家族成员之间的关系,例如父子进程。因此PCB中应该有相应的项描述家族关系。
- **现场信息:**这一部分信息量的多少依赖于CPU的结构。主要包括现行状态、现场保留区、程序和数据地址。
- 现行状态:说明进程的当前状态,作为调度程序分配处理机的依据。当进程处于阻塞状态时,要在PCB中说明阻塞的原因。
- 现场保留区:用于保存进程由执行状态变为阻塞状态时的CPU现场信息,例如程序状态字、通用寄存器、指令计数器等的内容。
- 程序和数据地址:记录该进程的程序和数据存放在内存或外存中的地址,用以把PCB与其程序和数据联系起来。
- **控制及资源管理信息:**主要包括进程的优先级、互斥和同步机制、资源清单和链接字。
- 进程优先级:标识进程使用CPU的优先级的整数。优先级高的进程可优先获得CPU。
- 互斥和同步机制:实现进程间的互斥与同步的机制,例如信号量或锁。
- 资源清单:列出进程所需资源及当前已获得的资源。
- 链接字:也称为进程队列指针,它给出了本进程所在队列中的下一个进程的PCB首地址。
2.进程的启动
启动进程的过程即启动程序或者命令的过程。通常,程序和命令保存在磁盘上,当在命令行中输入一个可执行程序的文件名或者命令并按Enter键后,Linux系统内核就把该程序或者命令的相关代码加载到内存中并开始执行。系统会为该程序或者命令创建一个或者多个相关的进程,以完成程序或者命令规定的任务。
启动进程的方式分为前台方式和后台方式两种。
2.1.前台启动进程
打开终端输入命令并按下Enter键,就以前台的方式启动了一个进程。例如,输入命令:
vi story
该命令就以前台的方式启动了一个进程,该进程专门负责执行vi编辑器程序。在该进程还未执行完时,可按Ctrl+Z
组合键将该进程暂时挂起,然后用ps
命令查看该进程的有关信息。ps
命令格式如下:
ps [选项]
常用的选项有:
选项 | 作用 | 选项 | 作用 |
---|---|---|---|
-e | 显示所有进程 | a | 显示所有终端的所有进程 |
-f | 以全格式显示所有的进程 | u | 以面向用户的格式显示多有的进程 |
-r | 只显示正在运行的进程 | x | 显示所有不占用终端的进程 |
-o | 以用户定义的格式显示所有进程 |
ps
命令默认只显示在本终端上运行的进程,除非指定了-e、a、x
等选项。当没有指定显示格式时,ps
命令采用默认格式,分PID、TTY、TIME、CMD4列显示,各列的含义如下:
列 | 含义 |
---|---|
PID | 进程标识号 |
TTY | 进程对应的终端,"?"标识该进程不占用终端 |
TIME | 进程累计使用的CPU时间 |
CMD | 进程执行的命令名 |
指定-f
选项时,采用全格式,分UID、PID、PPID、C、STIME、TTY、TIME、CMD8列显示进程。UID、PPID、C、STIME的含义如下:
列 | 含义 | 列 | 含义 |
---|---|---|---|
UID | 进程属主的用户名 | C | 进程最近使用的CPU时间 |
PPID | 父进程的标识号 | STIME | 进程开始时间 |
指定u
选项时,采用用户格式,分USER、PID、%CPU、%MEN、VSC、RSS、TTY、STAT、START、TIME、COMMAND11列显示进程,其中几列的含义如下:
列 | 含义 |
---|---|
USER | 同UID |
%CPU | 进程占用CPU的时间与进程总运行时间之比 |
%MEN | 进程占用内存与总内存之比 |
VSZ | 进程占用虚拟内存的大小,以KB为单位 |
RSS | 进程占用实际内存大小,以KB为单位 |
STAT | 进程当前状态,用字符表示。R为执行态,S为睡眠态,D为不可中断睡眠态,T为暂停态,Z为僵死态 |
START | 同STIME |
COMMAND | 同CMD |
2.2.以后台方式启动进程
在终端以后台方式启动进程,需要在执行的命令后面添加&符号。
vim song&
此时,执行jobs
命令还可以查看当前终端的后台进程:
3.终止进程
终止进程是系统管理员协调系统资源利用率的有效手段。当某个进程已经僵死或占用大量CPU时,就需要终止该进程。
要终止该进程有以下两种方法。
3.1.Ctrl+C组合键
Ctrl+C
可以终止一个前台执行的进程。如果想要终止后台执行态的进程,可以现使用fg
命令将该进程调至前台,再使用Ctrl+C
组合键终止它。
# 在1号终端执行
nohup nc -lp 8000 & # 在后台监听8000端口
# 在2号终端执行
netstat -antp | grep :8000 # 查看8000终端的进程PID
ps -ef | grep PID号
kill PID号 # 杀死进程
netstat -antp | grep :8000 # 再次查询这个进程已经没有
3.2.kill命令
kill
命令的格式为:
kill [-信号] PID
kill命令通过向进程发出终止信号使其退出运行,kill发出的信号可以有多种,每个信号都有一个编号,其中默认使用的是15编号SIGTERM。若进程已经无法响应终止信号,那么可以发出9信号SIGKILL,强行将其终止,此时就需要"-9"选项。
例如:我们开启一个vim进程并将其挂载至后台,由于在没有正常保存退出的情况下,vim进程是不允许被随意结束的,所以此时不加任何选项的kill命令是无法将vim进程终止的。
vim test.txt # 编辑末行模式下不保存按Ctrl+Z将进程转入后台
jobs -l # 查看后台进程
kill PID号 # 单纯用kill命令无法结束
jobs -l # 进程仍然挂起
kill -9 PID号 # 强制杀死进程
jobs -l
4.进程的调度
在Linux系统总,多个进程可以并发执行。但如果系统中并发执行的进程数量过多,会造成系统的整体性能下降。因此,用户可以根据一定的原则,对系统中的进程进行调度,例如终止进程、挂起进程、改变进程优先级等。
4.1.改变进程的优先级
在Linux系统中,每个进程都有特定的优先级。系统在位进程分配CPU等资源时,是通过优先级来进行判断的。优先级高的进程可以优先执行。但是通过命令来改变某些进程的优先级。
- ps命令:在终端下输入
ps -l
命令可以查看用户进程的优先级:
上图中,PRI和NI两列是与进程优先级有关的信息。PRI表示进程优先级,由操作系统动态计算,是进程的实际优先级。NI表示进程的请求优先级,它由进程拥有者或超级管理员进程设置,NI会影响到进程的实际优先级。
- nice命令:在启动进程是指定进程的请求优先级,语法格式如下:
nice [选项] 命令
常用选项是-n
,n值表示请求优先级,n的取值范围为-20~19。n值越小,请求优先级越高。默认请求优先级为10。
默认情况下,只有root用户才能提高进程的请求优先级,普通用户只能降低进程的请求优先级。
nice -15 vi&
ps -l
- renice命令:在进程执行时改变请求优先级,语法格式如下:
renice [+/-n] [-g 命令名...] [-p 进程标识号] [-u 进程所有者]
ps -l
renice +10 -p 32621
ps -l
4.2.挂起和激活进程
一个处于执行状态的进程被挂起时,会被系统自动转到后台,处于暂停状态;在合适的时候再被激活,恢复执行状态。
要挂起当前正在运行的前台进程,可通过Ctrl+Z
组合键来实现。要激活被挂起的进程,可以通过采用两种方式:fg
命令和bg
命令。
- **fg命令:**使被挂起的进程返回前台运行,语法格式如下:
fg [参数]
参数为数字n,代表进程的序列号。
**示例:**在前台启动vi
编辑器进程,创建文档时,在命令模式下,按下Ctrl+Z组合键,挂起该进程,再使用fg
命令记过该进程,继续编写文档,最终退出vi
:
- **bg命令:**激活被挂起的进程,使之再后台运行,语法格式如下:
bg [参数]
参数为数字n,代表进程的序列号。
**示例:**使用find
命令启动一个前台执行的进程,查找文件名为passwd的文件。在find命令执行期间(即还未找到passwd文件时),按下Ctrl+Z组合键,挂起该进程,系统将其调度至后台,并显示:
然后再启动另一个前台执行的进程—vi编辑器。在命令模式下按Ctrl+Z组合键,挂起该进程。
数字5标识当前系统中有5个被挂起的进程,均在后台。
接着再使用bg
命令,将find
命令和vi
命令进程激活,并转至后台运行:
bg 4
bg 5
4.3.进程的监视
监视进程,即了解当前系统中进程的运行情况,例如,哪些进程正在运行,哪些进程已经结束,是否有僵死进程,进程占用资源的情况,等等。这些信息对系统的高校运行具有重要的意义。
通过top
命令可以监控系统的各种资源(包括内存、CPU)的利用率。该命令会定期更新显示内容,默认根据CPU的负载大小进行排序。top
命令时Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况,类似于Windows中的任务管理器。其语法格式如下:
top [-选项]
常用选项如下:
选项 | 作用 |
---|---|
c | 显示整个命令行 |
d | 指定没两次屏幕刷新之间的时间间隔。默认3s刷新一次 |
i | 不显示任何闲置或僵死的进程 |
n | 指定监控信息每秒的更新次数 |
p | 进程标识号列表 |
s | 使top民老公再安全模式下运行 |
S | 使用累计模式 |
执行top
命令后,结果会不断更新。如果想要终止该命令的执行,可以按q
退出;如果想看到以内存利用率排序的显示,可以按m
键;如果想看到以执行时间排序的显示,可以按t
键。top
命令交互按键及作用:
按键 | 作用 |
---|---|
h或者? | 显示帮助画面,给出一些简短的命令总结说明 |
k | 终止一个进程。系统将提示用户输入要终止的进程的PID,以及要发送给该进程的信号。一般的终止进程可以使用信号15;如果进程不能正常结束,就是用信号9强制结束该进程。默认值是信号15。在安全模式下此命令被屏蔽 |
i | 忽略/显示闲置和僵死进程。这是一个开关式命令 |
q | 退出程序 |
r | 重新安排一个进程的优先级。系统提示用户输入需要改变的进程的PID以及需要设置的进程的优先级。输入正值将使优先级降低,反之则使优先级提高。默认值是10。 |
S | 切换到累计模式 |
s | 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间,单位是秒。如果有小数,就换算成毫秒。输入0则系统将不断刷新,默认值是5s.需要注意的是,如果设置的值太小,很可能会引起不断刷新,从而根本来不及看清显示的信息,而且系统负载也会大大增加 |
f/F | 从当前显示中添加或删除项目 |
o/O | 改变显示项目的顺序 |
l | 切换显示平均负载和启动时间信息 |
m | 切换显示内存信息 |
t | 切换显示进程和CPU状态信息 |
c | 切换显示命令名称和完整命令行 |
M | 按占用内存大小排序 |
P | 按占用CPU百分比排序 |
T | 按时间/累计时间排序 |
W | 将当前设置写入~/.toprc文件,这是修改top配置文件的推荐方法 |
5.系统日志
日志文件(log file)是记录Linux系统运行情况及详细信息的文件。系统运行过程中的错误情况或问题都会被日志文件记录下来,例如用户登录以及其他安全相关的问题。系统日志文件为管理员用户了解系统状态,跟踪系统使用情况等提供了可靠的依据。
5.1.常用的日志文件
日志文件都在/var/log目录下,通过ls
命令可以查看该目录下的日志文件都有哪些:
用户可以使用文本编辑器打开某个日志文件并查看其内容。日志文件通常详细记录了程序的执行状态、时间、日期、主机等信息。通过日志文件可以获得系统运行的详细信息。
- **日志文件类型:**Ubuntu系统在/var/log/目录下保存的日志文件很丰富,以方便系统在出现错误的时候查询相应的日志,如下表:
日志文件和子目录 | 说明 |
---|---|
/var/log/alternatives.log | 更新替代信息都记录在这个文件中 |
/var/log/apport.log | 应用程序崩溃记录(没有记录则没有该文件) |
/var/log/apt | 用apt-get安装卸载软件的信息 |
/var/log/auth.log | 登录认证日志 |
/var/log/boot.log | 包含系统启动信息的日志 |
/var/log/btmp | 巨鹿所有失败启动信息 |
/var/log/Consolekit | 记录控制台信息 |
/var/log/cpus | 设计所有打印信息的日志 |
/var/log/dist-upgrade | 记录dist-upgrade这种更新方式的信息 |
/var/log/dmesg | 包含内核缓冲信息。在系统启动时,显示屏幕上与硬件有关的信息 |
/var/log/dpkg.log | 包括安装或用dpkg命令清除软件包的日志 |
/var/log/faillog | 包含用户登录失败信息。错误登录命令也会记录在本文件中 |
/var/log/fontconfig.log | 与字体配置有关的日志文件 |
/var/log/fsck | 文件系统日志文件 |
/var/log/kern.log | 记录内核产生的日志,有助于在定制内核时解决问题 |
/var/log/lastlog | 记录所有用户的最近信息。这是一个二进制文件,因此需要用lastlog命令查看其内容 |
/var/log/mail/ | 这个子目录包含右键服务器的额外信息 |
/var/log/samba/ | 这个子目录包含samba存储信息 |
/var/log/wtmp | 记录每个用户详细的登录、注册等信息。使用wtmp命令可以发现谁追赠在登录系统,谁正在使用命令显示这个文件或信息等操作 |
/var/log/xorg.*.log | 来自*(如0、1)的日志信息 |
5.2.常用的日志文件
/varlog/dmesg文件
:这个日志文件记录了与启动Ubuntu有关的引导信息,包含内核缓冲信息。在系统启动时,显示屏幕上与硬件有关的信息。通过查看/var/log/dmesg文件,可以获知Linux系统能够检测出的硬件等信息。可以通过使用Gedit打开该文件,也可以通过在终端输入命令dmesg
命令打开它:
/var/log/wtmp文件
:这是一个二进制文件,记录每个用户的登录次数和持续时间等信息。该文件记录了每个用户登录、注销及系统的启动、停机的时间。因此,随着系统正常运行时间的推移,该文件的大小也会越来越大,该日志文件增大的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录。我们可以使用文本编辑器或last
命令来打开该文件:
last [-adRx] [-f] [-n] [用户名] [终端号]
选项 | 作用 |
---|---|
-a | 把登录系统时的主机名或IP地址显示在最后一行 |
-d | 将IP地址转换成主机名 |
-f | 指定记录文件 |
-n | 设置用户名的显示列数 |
-R | 不显示登录系统的主机名或IP地址 |
-x | 显示系统关机、重开机以及执行等级的改变等信息 |
6.系统监视器
Linux操作系统是一个典型的多用户、多终端系统,系统可能同时拥有多个用户,每个用户都有可能同时执行多个程序,而每个程序有可能启动多个进程。因此,从宏观和系统整体的角度出发,Linux系统资源将会分配给许许多多的进程使用。如果某些进程占用了大量的系统资源,就会造成系统负载过重、系统资源供不应求的局面。因此,系统管理员应该实时关注监控系统状态,了解系统资源的消耗情况,锁定消耗CPU资源最多的进程,以确保系统时刻处于较好的运行状态,保持较好的整体性能。
在Ubuntu系统中有两种方式可以启动系统监视器:
- 方法1:从桌面左下角找到
应用程序
图标,再找到系统监视器
图标,或在搜索中输入"system-monitor":
- 方法2:在终端中输入命令:
gnamo-system-monitor
系统监视器窗口包含“进程”、“资源”、“文件系统”的标签页,其中“进程”标签页中显示进程的名称、用户、CPU占用率、进程ID、所占内存大小等信息。选中进程,鼠标右键可以改变进程的优先级、停止、启动等操作。
在“资源”选项卡中,可以查看CPU历史、内存和交换历史、网络历史等情况;在“文件系统”选项卡中,可以查看设备及其对应的目录、相应文件系统的类型、磁盘空间总计、可用磁盘空间的大小、易用磁盘空间的大小和空闲磁盘空间的大小等信息。
7.查看内存状况
定期查看内存使用状况可以较好的掌握系统的运行情况。用户可以通过使用free
命令查看系统物理内存和交换分区的大小,以及已使用的、空闲的、共享的内存大小和缓存、高速缓存的大小等信息:
上述数据以MB为单位显示内存状况。
8.文件系统监控
对文件系统进行监控是进行系统监控的重要组成部分。用户可以通过df
命令查看系统磁盘空间状况:
默认情况下,该工具以KB为单位显示分区的大小。如果要使系统以MB或GB为单位显示,可以使用df -h
: