Linux 进程管理
你可以了解些什么
- 什么是进程
- 进程和程序的区别
- 如何查看进程
- 进程的终止
- 获得进程打开的文件
- 进程的优先级
前言
进程管理是 Linux 系统中一个非常重要的概念,但是,这并不意味着我们需要太过接近底层地去了解这些进程是如何运行的、内核是如何管理调度的、时间片是如何轮转分配的等问题,我们所需要关心的是如何控制这些进程,包括查看、启动、关闭、设置优先级等。
什么是进程
进程表示程序一次执行的过程,它是应用程序的运行实例,是一个动态地过程。或者更为简单的描述为:进程是操作系统当前运行的程序。
当一个进程开始运行时,就是启动了这个过程。进程包括动态执行的程序和数据两个部分。
现代操作系统支持多进程处理,这些进程可以接受操作系统的调度,所以说每个进程都是操作系统进行调度和分配的一个独立单位。
所有的进程都可能存在3中状态:
状态 | 含义 |
---|---|
运行态 | 程序当前实际占用着CPU等资源 |
就绪态 | 带灯CPU分配资源,随后运行 |
阻塞态 | 因请求外部资源而无法继续执行,制动放弃当前CPU资源转而等来所请求的资源 |
进程之间存在的两种关系
关系 | 含义 |
---|---|
互斥 | 进程间不能同时运行,必须等待一个进程运行完毕,另一进程才能运行 |
同步 | 进程间通过某种通信机制实现信息交互 |
现代计算机使用信号量机制来实现进程间的互斥和同步。
进程和程序的区别
我的理解,进程是程序在内存中的一个实例,是动态地。而程序是进程的来源,存储在持久性存储介质上的,是静态的。
如何查看进程
ps param
常用参数
参数 | 含义 |
---|---|
A | 列出所有的进程,和-e 有同样的效果 |
a | 列出不和本终端有关的所有进程 |
w | 显示加宽可以显示较多信息 |
u | 显示有效使用者相关进程 |
aux | 显示所有包含其他使用者的进程 |
使用-A
参数
使用-aux
参数
使用
ps
只是当前查询状态下进程瞬间的状态信息
top
命令提供了实时的系统状态监控,可以按照 CPU 使用、内存使用、执行时间等指标对进程进行排序。
第一行是服务器的基础信息,包括top
命令的刷新时间,系统的启动时长,当前等登陆用户数,系统的负载数据。
第二行是当前系统进程概况,进程总数、运行数、休眠数、停止的进程、僵尸进程。
第三行是CPU的信息,字母含义如下表
代号 | 含义 |
---|---|
us | 用户占用的CPU百分比 |
sy | 内核空间占用的CPU百分比 |
ni | 改变过优先级的进程占用的 CPU百分比 |
id | 空闲CPU百分比 |
wa | I/O等待百分比 |
hi | 硬中断百分比 |
si | 终端占用CPU百分比 |
第四行是物理内存的使用状态
第五行是虚拟内存的使用状态
最后是动态地进程信息
top 命令动态进程信息中没列的含义
字段 | 含义 |
---|---|
PID | 进程ID |
USER | 进程所有者 |
PR | 进程优先级 |
NI | nice值,赋值表示高优先级,正值表示低优先制 |
VIRT | 进程使用虚拟内存总量,单位为Kb,VIRT=SWAP+RES |
RES | 进程使用的为被换出的物理内存大小,单位为Kb,RES=CODE+DATA |
SHR | 共享内存大小,单位为Kb |
%CPU | 上次更新到现在的CPU时间占用百分比 |
$MEM | 进程使用的CPU时间占用百分比 |
TIME+ | 进程使用的CPU时间总计,单位为1/100秒 |
COMMAND | 进程名称(命令名/命令行) |
在进程页面按下
F
键,可以显示更多字段。前面打了*
号的就是当前显示的字段,要想显示更多字段可以按下字段前面的字母对应的键。
image按下O键可以进行排序,按下字段前面的字母对应的键排序,按下回车返回。默认按照CPU使用率排序。
进程的终止
要终止一个进程,需要通过 kill、killall 等命令来实现。
这些命令的原理都是向内核发送一个系统操作信号以及某个进程的标识符,使得内核对指定标识符的进程进行相应的操作。
一般来说,kill
命令需要和ps
命令联合使用。原因是kill
后面跟着的应该是需要被终止的进程的PID。典型用法是使用ps
查询进程的PID,然后使用kill
将其终止。
kill [信号代码] 进程ID
image
命令kill
后可以跟的信号代码一共有64种,使用kill -l
就可以看到具体有哪些,但是常用的一般只有3个,即HUP(1)/KILL(9)/TERM(15),分别代表重启、强行杀掉、正常结束。
实际上有一些进程因为运行中出现问题而无法通过这种方式停止,在这种情况下就需要进行强杀(参数-9
)。但是这个命令也有其天然的危险,就是进程可能会直接被系统终止,而没有清理之前申请的内存,这会造成一定程度的“内存泄漏”,因此一般情况下不建议使用。而-15
这个参数相比温和一些,她会使进程正常退出,它也是Linux默认的程序中断信号(也就是在不加参数的情况下默认使用的信号)。
killall httpd
这个命令可以不使用 PID 而使用进程名称,相对安全一些。
查询进程打开的文件
Linux 中一切皆文件,可以使用 lsof 工具来查看系统打开的文件。
lsof 这个工具在 CentOS7 中自带了。
常用参数列表
参数 | 含义 |
---|---|
filename | 显示打开指定文件的所有进程 |
c | 显示COMMAND列中包含指定字符的进程所有打开的文件 |
u | 显示所属于user进程打开的文件 |
g | 显示归属于 gid 的进程情况 |
d | 显示目录下被进程打开的文件 |
D | 搜索目录下的所有文件,时间相对较长 |
d | 显示指定文件描述符的进程 |
n | 不将IP转换为hostname,默认是不加 -n 参数 |
i | 用以显示符合条件的进程情况 |
这个命令可以在不加任何参数的情况下直接运行,但是该命令一定需要用 root 账号来执行,因为 lsof 在运行时需要访问很多核心文件,需要的权限很高,其所输出的是目前系统中所有打开的文件。
imageLinux 系统中有很多日志文件会不断地被写入、更新,/var/log/message
就是其中的一个。
查看当前使用该文件的进程
image这里报了一个警告,原因可能是因为root管理员没有run/user/1000/gvfs
这个文件夹的权限。解决方法如下:
su - root
umount /run/user/1000/gvfs
rm /run/user/1000/gvfs
然后再次运行这条命令,警告没有了。
使用 lsof 根据端口号查看进程,例如 80 端口
image进程的优先级调整
进程的nice
优先级取值范围为:-20~19,数值越低优先级越高,也就能更多地被操作系统调度运行,默认为0。
普通用户也可以给自己的进程设定优先级,但是范围为:0~19。
实际上,Linux 使用了“动态优先级”的调度算法来确定每一个进程的优先级,一个进程的最终优先级=优先级+nice优先级。
nice
命令仅限于在启动一个进程的时候同时赋予其nick
优先级,比如自己写的脚本,相以较高的优先级来运行:
nice -n -10 ./SctiptName
对于已经启动的进程,可以用renice
命令进行修改,不过,这需要先查询出该进程的PID(使用ps
命令)。
renice -10 -p PortNum
网友评论