进程管理
6. 进程管理
6.1 进程概念
在 Linux 系统当中:触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限配置。
程序被加载成为程序以及相关数据的示意图:
-
程序 (program):
通常为二进制程序放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为物理文件的形式存在;
-
进程 (process):
程序被触发后,运行者的权限与属性、程序的代码与所需数据等都会被加载内存中,操作系统并给予这个内存内的单元一个识别码(PID)。可以说,进程就是一个正在运行中的程序。
6.1.1 ps命令
ps命令可以:查看进程信息
- 它可以确定有哪些进程正在运行以及进程运行的状态、
- 进程是否结束,进程有没有僵死,
- 哪些进程占用了过多的资源
#命令语法:
ps [选项]
命令中[选项]的含义:
- -a:显示所有用户进程
- -e:显示进程环境变量
- -l:给出详细信息的列表
- -r:只显示正在运行的进程
- -S:增加CPU时间和页面出错的信息
- -w:按宽格式显示输出
- -u:打印用户格式,显示用户名和进程的起始时间
- -x:显示不带控制终端的进程
ps命令输出字段的含义
- USER:该进程属于哪个用户账号
- PID :进程号,可以唯一标识该进程
- %CPU:该进程使用掉的 CPU 资源百分比;
- %MEM:该进程所占用的物理内存百分比;
- VSZ :该进程使用的虚拟内存大小,以KB为单位
- RSS :该进程占用的物理内存的总数量,以KB为单位
- TTY :该进程是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
- STAT:该程序目前的状态
- R (Running):该程序正在运行中;
- S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
- D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况
- T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
- Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
- START:该进程开始运行的时间
- TIME :该进程实际使用的总CPU时间。
- COMMAND:被执行的命令行
示例:
-
显示所有不带控制台终端的进程,并显示用户名和进程的起始时间。
# a:显示所有用户进程 u:显示用户名和进程的起始时间 x:显示不带控制终端的进程 [root@bogon ~]# ps -aux
-
查看less进程是否在运行
[root@bogon ~]# ps -ax | grep less
- less命令用于对文件或其它输出进行分页显示,less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。
- 命令格式:less [参数] 文件
- 使用less时,可以使用[pageup]、[pagedown]等按键向前或向后翻看文件
- 命令grep是查找, 中间 | 是管道命令,代表ps与grep同时执行。grep是一种强大的文本搜索工具,它能使用正则搜索文件,并把匹配的行打印出来。下面是匹配与nginx字符有关的进程, 用grep过滤后进程信息列名也屏蔽了。

-
显示系统进程
[root@bogon ~]# ps
-
显示用户名和进程的起始时间
[root@bogon ~]# ps –u
-
显示用户root的进程
[root@bogon ~]# ps –u root | more
注:
- less可以按上下方向键来显示上下内容,而more不能通过上下方向键控制显示;
- less不必读整个文件,加载速度比more更快;
- less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容。
6.1.2 top命令
top命令可以显示当前正在运行的进程以及关于它们的重要信息,是持续监测进程运行状态。而ps命令是选取一个时间点的进程状态。
#命令语法:
top [-d 数字] [-bnp]
命令中部分[选项]的含义:
- -d:后面可以接秒数,就是整个进程界面更新的秒数。默认是5秒。
- -b:以批次的方式运行 top ,还有更多的参数可以使用。通常会搭配输出重定向来将批处理的结果输出成为文件。
- -n:与 -b 搭配,意义是,需要进行几次 top 的输出结果。
- -p:指定某些个 PID 来进行观察监测而已。
在 top 运行过程当中可以使用的按键命令:
- ?:显示在 top 当中可以输入的按键命令
- P:以 CPU 的使用资源排序显示
- M:以内存的使用资源排序显示
- N:以 PID 来排序
- T:由该进程使用的 CPU 时间累积 (TIME+) 排序
- k:给予某个 PID 一个信号 (signal)
- r:给予某个 PID 重新制定一个 nice 值
- q:离开 top 软件的按键
注:top命令的其他选项,可以参考 man top 帮助文档。
常用操作:
#每隔5秒显式所有进程的资源占用情况
[root@bogon ~]#top
#每隔2秒显式所有进程的资源占用情况
[root@bogon ~]#top -d 2
#每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
[root@bogon ~]#top -p 12345 -p 6789
例:使用top命令查看整体信息,每2秒更新一次进程信息。
[root@bogon ~]# top -d 2
- top 主要分为两个界面,上面的界面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
- 第一行(top...):这一行显示的信息分别为:
- 目前的时间,即是 22:01:54 那个选项;
- 启动到目前为止所经过的时间,即是 up 2:57 那个选项;
- 已经登陆系统的使用者人数,即是 2 user项目;
- load average:系统在 1, 5, 15 分钟的平均工作负载,即系统平均要负责运行几个程序(工作)的意思。越小代表系统越闲置,若高于1得要注意你的系统程序是否太过繁复了!
- 第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running,sleeping,stopped,zombie)。比较需要注意的是最后的 zombie 那个数值,如果不是0,需要检查是哪个进程变成僵尸进程。
- 第三行(Cpus...):显示的是 CPU 的整体负载,每个选项可使用 ? 查阅。需要特别注意的是 %wa ,那个选项代表的是I/O wait, 通常系统会变慢都是 I/O 产生的问题比较大!因此需要注意这个项目耗用 CPU 的资源!
- 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。要注意的是 swap 的使用量要尽量的少!如果 swap 被大量使用,表示系统的物理内存实在不足!
- 第六行:当在 top 程序当中输入命令时,显示状态的地方。 (输入k或r等)
- 第一行(top...):这一行显示的信息分别为:
- top 下半部分的界面,则是每个进程使用的资源情况。需要注意的是:
- PID :每个进程的 ID
- USER:该进程所属的用户
- PR :Priority 的简写,程序的优先执行顺序,越小越早被执行
- NI :Nice 的简写,与 Priority 有关,也是越小越早被执行
- %CPU:CPU 的使用率
- %MEM:内存的使用率
- TIME+:CPU 使用时间的累加
6.1.3 pgrep命令
pgrep命令是通过程序的名字来查询进程,一般是用来判断程序是否正在运行,并查找正在运行进程的PID信息。
#命令语法:
pgrep [选项] 程序名
常用选项:默认只显示PID
- -l 同时显示进程名和PID
- -o 当匹配多个进程时,显示进程号最小的那个
- -n 当匹配多个进程时,显示进程号最大的那个
注:进程号越大,并不一定意味着进程的启动时间越晚
例:使用pgrep命令查找远程登录程序ssh的进程信息
[root@bogon ~]#pgrep ssh
[root@bogon ~]# pgrep -l ssh
[root@bogon ~]# pgrep -o ssh
[root@bogon ~]# pgrep -n ssh
6.2 进程状态
6.2.1 五种进程状态
进程由父进程创建,每个进程包含下面五种状态:
- R (Running):该程序正在运行中;
- S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
- D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况
- T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
- Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
6.2.2 pstree命令
pstree命令以树状图显示进程间的关系,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。
#命令格式:
pstree [-A|U] [-up]
常用选项:
- -A :各程序树之间的连接,以 ASCII 字符来连接;
- -U :各程序树之间的连接,以utf-8码的字符来连接。在某些终端接口下可能会有错误;
- -p :同时列出每个进程的 PID;
- -u :同时列出每个进程的所属帐号名称。
例1:列出目前系统上所有进程树的相关性:
pstree -A
6.3 进程的管理
在linux中,进程之间通过信号(signal)来进行异步通信,并由kill来发送信号。我们可以使用kill –l(小写的L)或者man 7 signal来查找signal的信息。
6.3.1 主要的信号代号与名称
| 代号 | 名称 | 内容 |
|---|---|---|
| 1 | SIGHUP | 启动被终止的程序,可让该 PID 重新读取自己的配置文件,类似重新启动 |
| 2 | SIGINT | 相当于用键盘输入[ctrl]-c来中断一个程序的进行 |
| 9 | SIGKILL | 代表强制中断一个进程的进行,如果该程序进行到一半,那么尚未完成的部分可能会有“半产品”产生,类似vim会有.filename.swp 保留下来。 |
| 15 | SIGTERM | 以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的操作会将它完成。不过,如果该进程已经发生问题,就是无法使用正常的方法终止时,输入这个signal也是没有用的。 |
| 17 | SIGSTOP | 相当于用键盘输入[ctrl]-z来暂停一个进程的进行 |
6.3.2 kill命令
kill指令就像是Windows系统中的任务管理->结束任务一样。基本语法:
kill[选项] 进程号(功能描述:通过进程号杀死进程)killall进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负 载过大而变得很慢时很有用)- 常用选项:
-9 :表示强迫进程立即停止
通过kill命令:传递信号
#语法格式:
kill –signal PID
例:结束进程名为top的进程
-
查看进程信息,进程名为top的进程号是4742;

-
然后结束该进程,如下所示:

注:确定该进程是否终止的方法是再次使用ps命令查看该进程的PID或进程名是否存在。
6.3.3 killall命令
Linux系统中的killall命令用于:杀死指定名字的进程。
我们可以使用kill命令杀死指定PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一。
#语法格式:
killall –signal 命令名称
例:结束top命令的进程

6.4 作业控制
作业控制(job control)是在单一终端机下同时进行多个工作的行为管理,它分为前台进程和后台进程。
- 前台:你可以控制和执行命令的这个环境称为前台(foreground) 的工作
- 后台:可以自行运行的工作,你无法使用 [ctrl]+c 终止它,可使用 bg/fg 调用该工作
6.4.1 Ctrl+z
[Ctrl]+z表示将目前的工作丢到后台中暂停
例:使用vi打开文件后,并按[Ctrl]+z
6.4.2 jobs命令
jobs命令用来查看目前的后台工作状态
#命令语法:
jobs [-lrs]
常用选项:
- -l :除了列出 job number 与命令串之外,同时列出 PID 的号码;
- -r :仅列出正在后台 run 的工作;
- -s :仅列出正在后台当中暂停 (stop) 的工作。
例:查看目前所有的工作和对应的PID
6.4.3 fg命令
fg命令表示将后台工作拿到前台来处理
#命令语法:
fg %jobnumber
选项与参数:
- %jobnumber :jobnumber 为工作号码(数字)。
- 注意,那个 % 是可有可无的!
例:将暂停的工作PID为5327,拿到前台来,重回vi界面。

注:%1中的值1,为暂停的工作号[1]。
6.4.4 bg命令
bg命令用于将作业放到后台运行,使前台可以执行其他任务
#命令语法:
bg %jobnumber
选项与参数:
- %jobnumber :jobnumber 为工作号码(数字)。
- 注意,那个 % 是可有可无的!
总结
浙公网安备 33010602011771号