#21 在Linux里进程管理详解,与pstree、ps、pgrep、pkill、pidof、top命令的应用
进程管理:
所谓进程:process,一个活动的程序的实体的副本;
生命周期;
可能包含一个或多个执行流;
创建进程:
每个进程的组织结构是一致的:
内核在正常启动并且全面接管硬件资源之后,会创建一个init的进程;而这个名叫init的进程负责用户空间的进程管理;
centos5及以前:sysV init,classic init
有缺陷:在启动系统时,init通过写脚本的方式来创建各个子进程;利用shell来实现,因此其执行速度非常慢;导致系统的启动速度和进程的创建速度都非常慢;
centos6:upstart,由Ubuntu研发的新型的init进程;可以并行的启动某些有关联的服务进程,在创建进程的时候,可以多线创建进程;如果有多个CPU或者有多颗CPU核心的话,其进程的创建速度会有比较明显的变化;第一个进程名称仍然是init;
centos7:systemd,参考了Mac OS的启动逻辑开发一款新版的init程序,其可以以其自身独立完成整个操作系统的启动工作;也就是说,在开机并加载内核之后,只需要启动一个systemd进程就可以将其他各服务进程启动起来,从而引导整个系统启动;
/sbin/init
/sbin/systemd
除了init进程之外,其他 的各个进程都是由其父进程创建的;
由fork()系统调用来实现的;
每个父进程通过fork()系统调用,复制自身的数据给子进程使用;这种复制方式不是立即复制,而是写时复制(cow);
终止进程:
任务父进程创建的子进程都必须由父进程亲自销毁;
任何的进程的父子关系都保存在task struct中;
进程优先级:
0-139
1-99:实时优先级,数字越大优先级越高;在系统启动时启动的进程;
100-139:静态优先级,数字越小优先级越高;在用户执行某些应用程序的时候启动的进程;
nice值:
-20~19:默认的nice值0;
只有管理员才能使用负整数的nice值,以提升进程的优先级;
而普通用户只能使用正整数的nice值,以降低进程的优先级;
划分了140个进程队列;
big O标准:
O(1),O(logn),O(N),O(N^2),O(2^N)
进程的分类:
按照进程的启动方式;
守护进程:
daemon,通常是在系统引导的过程被启动的,与任何的终端无关;也可以通过终端启动;
用户进程:
用户登录到系统之后,通过终端启动的进程;
按照进程的运行位置:
前台进程:
在进程启动之后,进程一直占用标准输出或者标准输入或者同时占用标准输出和标准输入;
后台进程:
在进程启动之后,进程不占用标准输出和标准输入;
按照进程对于资源消耗:
cpu-bond:非交互式的进程;
io-bond:编辑器等各种交互式进程;
Linux系统上与进程有关的命令(查看命令和管理类命令):
pstree,ps,pidof,pgrep,pkill,top,htop,glances,dstat,pmap,vmstat,bg,fg,jobs,kill,killall,nohup,nice,renice,...
pstree:
pstree - display a tree of processes
ps:
ps - report a snapshot of the current processes.
ps [options]
1 UNIX options, which may be grouped and must be preceded by a dash.
2 BSD options, which may be grouped and must not be used with a dash.
3 GNU long options, which are preceded by two dashes.
常用选项:
a:显示所有与终端相关的进程;
x:显示所有与终端无关的进程;
u:显示发起进程的用户的账户名称;
常用的选项组合之一:aux
ps aux命令像是的结果中各字段的含义:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER:进程的所有者
PID:进程标识符
%CPU:进程占用的CPU处理时间的百分比;
%MEM:进程占用的物理内存的百分比;
VSZ:虚拟内存集(可交换内存集)
RSS:常驻内存集的
TTY:进程与哪个终端相关;?表示与终端无关;
STAT:
R:running,正在运行的进程;
S:interuptible sleeping,可中断的睡眠状态;
D:unintelligible sleeping,不可中断的睡眠状态;disk block;
T:trace/stopped,被跟踪/已停止;
Z:zombie,僵死态;
+:前台进程
l:包含多线程的进程;
<:高优先级进程
N:低优先级进程
s:session leader,有子进程的父进程;
START:进程开始执行的时候时间戳
TIME:进程累计的CPU占用时间;
COMMAND:启动进程的命令行参数;
UNIX风格的选项:
-e:显示所有进程
-f:显示完整格式的进程信息
-F:显示完整格式的进程信息,与-f几乎相同;
-H:以层级机构宣誓进程的父子关系
o| -o field1,field2,...:以自定义字段的方式显示进程相关信息;
field:pid,ppid,ni,rtprio,psr,pcpu,stat,comm,user,tty,vsz,rss,...
常用的选项组合之二:-ef
PPID:父进程PID
C:表示进程占用的CPU时间的百分比
常用的选项组合之三:-eF
SZ:虚拟内存集
RSS:常驻内存集
PSR:表示此进程在哪个CPU核心上运行;
常用的选项组合之四:-eFH
常用的选项组合之五:-eo | axo fielde1,fielde2,...
pgrep, pkill:
pgrep, pkill - look up or signal processes based on name and other attributes
根据进程名称或其他属性查看进行或向进程发送信号;
pgrep [options] pattern
pkill [options] pattern
常用选项:
-u uid:显示进程的有效用户;
-U uid:显示进程的真是用户;
-t TERM:显示与指定的终端相关的进程;
-l:显示进程名称;
-a:显示进程的完整的命令行参数;
pidof:
显示指定进程名称对应的进程ID;
top:
top - display Linux processes
top首部:
第一行:uptime信息;
当前系统时间
系统的运行时长
当前登录系统的用户总数
过去的1分钟,5分钟,15分钟的在CPU上等待运行的进程队列的平均长度
第二行:
系统中运行的进程总数
正在运行的进程数
处于睡眠状态的进程数
已停止的进程数
僵死态的进程数
第三行:CPU时间占用百分比
us:user space,用户空间的进程占用的CPU时间的百分比;
sy:system,内和空间的内核进程占用的CPU时间的百分比;
ni:nice,使用nice值调整了进程优先级之后额外多占用的CPU时间百分比;
id:idle,CPU空闲时间的百分比;
wa:waiting,等待IO完成所消耗的CPU时间的百分比
hi:hardware interupting,处理硬件中断时间所消耗的CPU时间的百分比;
si:software interupting,处理软件中断时间所消耗的CPU时间的百分比;
st:stolen,被虚拟化程序等偷走的CPU时间的百分比
第四行:以KB为单位显示物理内存空间的使用情况;
total:物理内存空间的总大小;
free:空闲的物理内存空间大小;
userd:已经被使用的物理内存空间大小;
buffer/cache:缓冲区和缓存区消耗的物理内存空间大小;这段内存空间随时可以回收,不算真正的消耗;
avail mem:真正可用的内存空间大小;
第五行:以KB为单位显示swap空间的使用情况;
total:虚拟内存空间的总大小
used:已经被使用的虚拟内存空间大小;
free:空闲的虚拟内存空间大小;
交互式命令:
1:显示或隐藏CPU核心信息;
P:根据CPU占用百分比进行排序;
M:根据物理内存占用百分比进行排序;
T:根据累计CPU占用时间进行排序;
l:关闭或显示uptime信息;
t:关闭或显示第二、第三行信息;
m:关闭或显示第四、第五行信息;
q:退出top交换模式;
s:修改top的刷新时间间隔;
k:终止某个指定PID的进程的运行
常用的选项:
-d #:指定top刷新的时间间隔,默认是3秒;
-b:按批次显示进程信息
-n #:通常与-b选项一起使用,表示显示多少批;