第十七章 程序管理与SELinux初探--进程、进程管理(ps、top)
一个程序被加载到内存当中运行,在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的类型存在。系统进程有哪些状态?不同状态会如何影响系统的运行?进程之间是否可以互相管控?
16.1 什么是进程 process
在Linux系统当中:触发任何一个事件时,系统都会将他定义成为一个进程,并且给这个进程一个ID,称为 PID
同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置,此后,这个PID能够在系统上面进行的操作,就与这个PID的权限有关
16.1.1 进程与程序(process & program)
"执行一个程序或指令"就可以触发一个事件而取得一个PID
系统应该是仅认识二进制文件的,当我们要让系统工作的时候,就需要启动一个二进制文件,那个二进制文件就是程序(program)
每个进程都有三组人的权限,每组人都有 r/w/x 的权限,所以不同的用户身份执行这个程序时,系统给予的权限都不相同
程序一般是放在磁盘中,然后通过用户的执行来触发。触发后会加载到内存中成为一个个体,就是内存。
为了操作系统能够管理这个进程,进程给予执行者的权限/属性等参数,并包括进程所需要的脚本与数据或文件数据等,最后再给予一个PID
系统就是通过这个PID来判断该process是否具有权限进行工作的,它是很重要的
程序与进程的总结:
程序(program):通常为二进制程序放在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在。
进程(process)):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),进程就是一个正在运行中的程序。
子进程与父进程:
登录系统,会取得一个bash的shell,然后用这个bash提供的接口去执行另一个命令,如 /usr/bin/passwd 或者是 touch等,那些另外执行的命令也会被触发成为PID,那个后来执行命令才产生的PID就是”子进程“,而我们原本的bash环境下,就成为“父进程”
程序彼此之间是有相关性的,如上图,连续执行两个bash后,第二个 bash 的父程序就是前一个bash。
每个程序都有一个 PID,那某个程序的父程序如何判断?
通过 Parent PID(PPID)来判断即可
子程序可以取得父程序的环境变量
在bash环境下触发一次bash,用 ps -l 命令观察程序相关的输出信息
直接执行bash会进入到子程序的环境中,输入命令 ps -l 后出现
关闭进程的时候,过一阵子又产生了,而且新产生的程序的PID与原来的还不一样。这是因为 有一支父程序存在,所以杀掉子程序后,父程序就会主动再产生一支子进程,如果要杀掉子进程,应该找到父进程然后将他删除。
fork and exec:过程调用的流程
子进程与父进程之间的关系最大的复杂点在于进程互相之间的调用,在Linux的过程调用中通常称为 fork-and-exec 的流程
进程都会通过父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程
最终就成为一个子进程的存在,整个流程如下图
(1)系统先以fork的方式复制一个与父程序相同的暂存程序,这个程序与父程序唯一的差别就是PID不同,但是这个暂存程序还会多一个PPID的参数。PPID如前面所述就是父程序的程序识别码,
(2) 暂存程序开始以exec的方式载入实际要执行的程序,如上图所述,新的程序名称为qqq,最终子程序的程序码就会变成qqq。
系统或网络服务:常驻在内存的进程
前面学过的一些指令看,我们下达的指令都很简单。包括 ls 显示文件、touch创建文件、rm/mkdir/cp/mv 等指令管理文件、 chmod/chown/passwd 等等的指令来管理权限等,这些指令都是执行完就结束了。该项指令被触发后所产生的PID很快就会终止。
常驻内存当中的进程:
系统每分钟都会去扫描 /etc/crontab 以及相关的配置文件,来进行工作调度,这个工作是 crond这个进程所管理的,它启动后在后台当中一直持续不断的运行,就是常驻在内存当中的进程。
常驻内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻进程就会被我们称为服务(daemon)。
系统的服务非常多,大致分成系统本身所需要的服务,如crond及atd,还有syslog等。还有一些则是负责网络联机的服务,例如 Apache、named、postfix、vsftpd...等。这些网络服务比较有趣的地方在于这些程序被执行后,会启动一个可以负责网络监听的端口(port),以提供外部客户端的连接请求。
17.3 进程管理
17.3.1 进程查看 ps静态查看进程的变化
查看进程的命令:ps、top、pstree
ps:将某个时间点的进程运行情况选取下来
ps aux:查看系统所有的进程数据
ps -lA :查看所有系统的数据
ps axjf:连同部分进程树状态
参数详解:
-A:所有的进程均显示出来,与 -e 具有同样的作用
-a:不与 terminal 有关的所有进程
-u:有效用户(effective user)相关的进程
x:通常与a这个参数一起使用,可列出较完整信息
输出格式规划:
l:较长、较详细地将该 PID 的信息列出
j:工作的格式(jobs format)
-f:做一个更为完整的输出
ps命令使用时直接背两个比较不同的参数:
ps -l:只能查阅自己bash程序进程
ps aux:可以查看所有系统运行的进程
ps -l命令显示信息详解:
F:代表这个进程标志,说明这个进程的权限,常见号码:
4表示此进程的权限为root
1表示此子进程仅可进行复制(fork)而无法实际执行(exec)
S:代表这个进程的状态(STAT),主要状态有:
R(Running):该进程正在运行中
S(Sleep):该进程目前正在睡眠状态,但可以被唤醒
D:不可被唤醒的睡眠状态,通常这个进程可能在等待 I/O 的情况(ex>打印)
T:停止状态(stop),可能是在工作控制(后台暂停)或除错(traced)状态
Z(Zombie):“僵尸”状态,进程已经终止但却无法被删除至内存外
UID/PID/PPID :代表此进程被该 UID 所拥有/进程的PID号码/此进程的父进程PID号码
C:代表CPU使用率,单位为百分比
PRI/NI:Priority/Nice的缩写,代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR是 kernel function,指出该进程在内存的哪个部分,如果是个Running的进程。显示"-"
SZ代表此进程用掉多少内存
WCHAN 表示目前进程是否运行中,为“-”表示正在运行中
TTY:登录者的终端机位置,若为远程登录则使用动态终端接口(pts/n)
TIME:使用掉的CPU时间,注意,是此进程实际花费 CPU 运行的时间,而不是系统时间。
CMD:就是command的缩写,造成此程序的触发进程的命令是什么
ps aux:列出目前所有正在内存当中的进程
各字段含义:
USER:该进程属于哪个用户账户的
PID:进程标识符
%CPU:该进程使用掉的 CPU资源百分比
%MEM:该进程占用的物理内存百分比
VSZ:该进程使用掉的虚拟内存量(KB)
RSS:该进程占用的固定的内存量(KB)
TTY:该进程是在哪个终端机上面运行,若与终端机无关则显示 ?
tty1~tty6 是本机上面的登录者程序,若为pts/0等,则表示由网络连接进主机的进程
STAT:该进程目前的状态,状态显示与 ps -l 的S标识相同(R/S/T/Z)
START:该进程被触发启动的时间
TIME:该进程实际使用CPU运行的时间
COMMAND:该进程的实际命令
一般来说 ps aux 会依照PID的顺序来排序显示
ps -lA:显示出系统所有的进程
ps axjf: 连同部分进程树状态
僵尸进程:
造成僵尸进程的原因是该进程应该已经执行完毕,或者是因故应该要终止了,但该进程的父进程却无法完整将该进程结束掉,而造成那个进程一直存在在内存中
僵尸进程无法管控,而是直接交给init 这只程序来负责
init 是系统第一个执行的程序,是所有进程的父进程,我们无法杀掉该进程
所以如果产生僵尸进程,而系统过阵子还没有办法通过内核非经常性的特殊处理来将该进程删除时,只好通过 reboot的方式将该进程抹去
top:动态查看进程的变化
ps是选取一个时间点的进程状态 top则可以持续检测进程运行的状态
top -d 2:表示每2秒钟更新一次top
top命令默认每次更新进程资源的时间为5秒
top主要分为两个界面,上面的界面为整个系统资源的使用情况
第一行top:显示的信息分别为
目前的时间 15:28:57
开机到目前为止经过的时间,up 316 days,22:52,
已经登录系统的用户人数 5 users
系统在1,5,15分钟的平均工作负载:负载小于0.8就是这个负载,代表的是1,5,15分钟系统平均要负责运行几个进程的意思。
越小代表系统越闲置,若大于1要注意系统压力是否太过繁复
第二行:Tasks
显示的是目前进程的总量与个别进程在什么状态(running、sleeping、stopped、zombie)
zombie如果不是0,需要注意是哪个进程变成僵尸进程
第三行(Cpus):显示 CPU 的整体负载,每个选项可使用 ? 查阅
%wa:I/Owait 通常系统变慢都是 I/O产生的问题比较大 要注意这个选项耗用的CPU资源。另外如果是多内核的设备,可以按下数字键1来切换成不同 CPU 的负载率
第四行与第五行:表示目前的物理内存与虚拟内存(Mem/Swap)的使用情况
Swap的使用量要尽量少,如果swap被大量使用,表示系统的物理内存不足
第六行:当在top进程当中输入命令时显示状态的地方
top命令下半部分是每个进程使用的资源情况,需要注意:
PID:每个进程的ID
USER:该进程所属的用户
PR:Priority的简写,进程的优先执行顺序,越小越早被执行
NI:Nice的简写,与Priority有关,也是越小越早被执行
%CPU:CPU的使用率
%MEM:内存的使用率
TIME+:CPU使用时间的累加
top默认使用CPU使用率(%CPU)作为排序的重点
按键M:使用内存使用率排序
按下P恢复
top [-d 数字] | top [-bnp]
参数:
-d:后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒
-b:以批次的方式执行 top,还有更多的参数可以使用 通常会搭配数据流重定向来将批处理结果输出成为文件
-n:与 -b搭配,意义是,需要进行几次 top 的输出结果
-p:指定某些个 PID来进行查看监测而已
在top执行过程中可以使用的按键命令:
?:显示在 top 当中可以输入的按键命令
P:以 CPU 的使用资源排序显示,top命令默认就是使用CPU的使用资源排序显示
M:以内存的使用资源排序显示
N:以 PID 来排序
T:该进程使用的 CPU 时间累积排序
K:给予某个 PID 一个信号(signal)
r:给予某个 PID重新制定一个 nice值
q:离开 top软件的按键
想要查看的进程 CPU与内存使用率都很低,总是无法在第一行显示时,仅查看单一进程
我们自己的 bash PID可由 $$ 变量取得
echo $$ : 取得我们自己的bash进程号
在top下面进行一些操作,例如修改NI这个数值
在top下输入 r 这个命令,输入进程号9197,输入要更改的值 value 如下:
找出最损耗CPU资源的那个进程,使用top命令,然后强制以 CPU使用资源来排序(在top当中按下 P即可)
找进程之间的相关性 用 pstree这个命令
输入 pstree 可以查到进程相关性
pstree [-A|U] [-up]
参数:
-A:各进程树之间的连接以 ASCII 字符来连接
-U:各进程树之间的连接以 utf8 码的字符来连接,在某些终端接口下可能会有错误
-p:同时列出每个进程的PID
-u:同时列出每个进程的所属账号名称
所有的进程都依附在 init 这个进程下面。 init 的进程号PID是 1
因为 init 是Linux内核所主动调用的第一个进程
重启进程的命令 reboot
如果子进程挂点或者老是杀不掉子进程时,用 pstree这个命令找到子进程的父进程