一、Linux进程概念

1.进程:Process,是运行中的程序的一个副本,有生命周期,都由其父进程创建

Linux内核存储进程信息的固定格式:taskstruct

多个任务的的taskstruct组件的链表:task list

2.进程优先级:0-139

0:一般不使用

1-99:实时优先级;数字越大优先级越高,系统自动安排

100-139:静态优先级;数字越小优先级越高,可手动更改

3.Nice值:-20至19,对应于100到139

普通用户只能将自己的优先级调低,root用户可以随意调制

每个队列有两对:运行队列、过期队列,140对280队,通过CPU中断控制来给进程运行时间

4.进程内存

内存是以Page Frame:页框的方式存储页面数据

每个内存页框的MMU(Memory Management Unit,内存管理单元)的大小一般为4k

进程在内存上的存储单元可能是不连续的

5.IPC:Inter Process Communication进程间通信

同一主机上:signal信号、shm: shared memory共享内存、semerphor旗语手势

不同主机上:rpc: remote procecure call远程过程调用、socket套接字

6.进程类型

守护进程:在系统引导过程中启动的进程,跟终端无关的进程;

前台(用户)进程:跟终端相关,通过终端启动的进程

注意:也可把在前台启动的进程送往后台,以守护模式运行;

7.进程状态

运行态:running,进程占用CPU,并在CPU上运行;

就绪态:ready,进程已经具备运行条件,但是CPU还没有分配过来;

可中断睡眠态:处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。

不可中断睡眠:进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。但是有延迟

可中断:interruptable

不可中断:uninterruptable,不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。

停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped

僵死态:zombie,结束进程,父进程结束前,子进程不关,不可被kill, 即不响应任务信号, 无法用SIGKILL杀死

8.进程的分类

CPU-Bound:cpu密集型,对CPU占用大,非交互式的占用大

IO-Bound:io密集型,对io占用大,交互式的占用大

9.进程的数字标识16bits:

0-65535:有效使用1-65535

1-1023:固定分配,服务器使用,而且只有管理员有权限启用;

1024-4W:半固定,服务,如mysql等

4W+:临时;标识临时通信进程

10.CentOS 5/6/7的启动进程

CentOS 5: SysV init,在系统启动和创建进程借助脚本,串行启动,速度慢

CentOS 6:upstart,在5的基础上升级,同为脚本启动,但时可以支持并行启动

CentOS 7:systemd,并行,以systemd为单一进程同时启动其他进程

二、进程管理相关命令

1.pstree:进程树查看

常用选项:

-p:打印个进程的pid

实例:

[root@young ~]# pstree -p
systemd(1)─┬─abrt-watch-log(791)
           ├─abrt-watch-log(799)
           ├─abrtd(788)
           ├─alsactl(785)
           ├─at-spi-bus-laun(88842)─┬─dbus-daemon(88859)
           │                        ├─{at-spi-bus-laun}(88846)
           │                        ├─{at-spi-bus-laun}(88852)
           │                        └─{at-spi-bus-laun}(88865)
           ├─at-spi2-registr(88871)───{at-spi2-registr}(88873)
            ...

2.ps:process state,查看当前进程状态

Linux各进程的相关信息在/proc目录有一个以其PID命令的目录下的众多文件中.

常用选项:

a:所有与终端相关的进程;

x:所有与终端无关的进程;

u:以用户为中心组织进程状态信息显示

-e:显示所有进程

-f:显示完整格式的进程信息

-F:显示完整格式的进程信息;

-H:以层级(树状)结构显示进程的相关信息;

o  field1, field2,...:自定义要显示的字段列表,以逗号分隔;

实例:

1) # ps aux:显示所有与终端有无关联的进程信息,一用户为中心组织状态信息显示

[root@young ~]# ps aux | head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.2 128892  8792 ?        Ss   Feb06   3:34 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    Feb06   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    Feb06   0:14 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    Feb06   0:00 [migration/0]

说明:

USER:运行该进程的用户

PID:进程的ID号码

%CPU:CPU的占用百分比

%MEM:内存空间占用比率,占用整个内存空间的比例

VSZ(Virutal memory SiZe):虚拟内存集;占用的虚拟内存大小,真正用来占用的内存

每个内存占用的内存有两种:线性内存空间、物理内存空间

  • 线性内存:会映射到物理内存,在线性内存空间角度看是连续的内存占用

  • 物理内存:实际上是以内存页框保存,可能一个进程占用的不连续的页框

RSS:ResidentSize,常驻内存集;坚决不能转换到swap中内存集

TTY:运行终端

STAT:当前进程的运行状态,BSD样式

  • R:running,运行态

  • S:interruptable sleeping,可中断睡眠

  • D:uninterruptable sleeping,不可中断睡眠

  • T:Stopped,停止状态

  • Z:zombie,僵死状态,进程结束后,在被回收之前状态

  • +:表示一个前台进程,占据命令提示符

  • l:多线程进程

  • N:低优先级进程

  • <:高优先级进程

  • s:session leader ,回话主导进程,如shell,其主导其下的进程

START:进程开始时间

TIME:累计运行CPU时间

COMMAND:使用进程、线程,[]: 内核线程

2) # ps -ef:以完整格式显示所有的进程信息

[root@young ~]# ps -ef|head -5
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 Feb06 ?        00:03:35 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 Feb06 ?        00:00:00 [kthreadd]
root          3      2  0 Feb06 ?        00:00:14 [ksoftirqd/0]
root          7      2  0 Feb06 ?        00:00:00 [migration/0]

说明:

  • UID:启动进程用户

  • PID:运行进程号

  • PPID:父进程的进程号,0在内核启动init之前存在,init启动后终止,存在过渡,一般为swap的进程

  • C:cpu utilization,CPU的占用百分比

  • STIME:启动时间

  • TTY:与其终端相关

  • TIME:累计运行CPU时间

  • CMD:启动此进程的命令

3) # ps -eFH:树状层级结构显示

F比f显示的信息更加全面,层级结构显示,缩进相同同层级

PSR:运行在哪颗CPU上,十进制编号,0/1/2/3

[root@young ~]# ps -eFH|head -5
UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
root          2      0  0     0     0   0 Feb06 ?        00:00:00 [kthreadd]
root          3      2  0     0     0   0 Feb06 ?        00:00:14   [ksoftirqd/0]
root          7      2  0     0     0   0 Feb06 ?        00:00:00   [migration/0]
root          8      2  0     0     0   0 Feb06 ?        00:00:00   [rcu_bh]

4) # ps -eo , #ps axo显示自定义字段列表

o field1, field2,...:自定义要显示的字段列表,以逗号分隔,o要写在后面,因为要带参数

常用的field:pid,ni, pri, psr, pcpu, stat, comm, tty, ppid, rtprio

  • ni:nice值;

  • priority:priority,优先级;

  • rtprio:realtime priority,实时优先级;

    [root@young ~]# ps axo pid,ni,pri,psr|head -5
     PID  NI PRI PSR
     1   0  19   0
     2   0  19   0
     3   0  19   0
     7   - 139   0
    
    [root@young ~]# ps -eo pid,ni,pri|head -5
    PID  NI PRI
    1   0  19
    2   0  19
    3   0  19
    7   - 139

3.pgrep命令

用法:

pgrep [OPTIONS] [PATTERN]

:PATTERN: 支持正则表达元字符书写模式实现进程过滤;

常用选项:

-U UID:仅显示由指定用户身份运行的进程PID
-G GID:仅显示以指定组身份运行的进程PID
-t term: 仅显示指定的终端设备的进程PID
-l: 显示进程PID的同时显示进程名
-a: 显示完整格式的进程名
-u uid: effective user,生效者
-P pid: 显示指定进程的子进程

实例:

1)显示以root身份运行的进程的PID

[root@young ~]# pgrep -U root|head -5 
1
2
3
7
8

2)显示以root组身份运行的进程的PID

[root@young ~]# pgrep -G root|head -5
1
2
3
7
8

3)显示以tty1终端运行的进程PID

[root@young ~]# pgrep -t tty1
88406
88472
88494
88495

4)显示以root身份运行,root组运行,且终端为tty1进程的PID与进程名

[root@young ~]# pgrep -U root -G root -t tty1 -l
88406 bash
88472 startx
88494 xinit
88495 X

5)使用正则表达式做模式匹配

[root@young ~]# pgrep "\" -l  
19320 bash
88406 bash
125591 bash

4.pidof:根据进程名获取其PID;

格式:

pidof PROGRAM

实例:

[root@young ~]# pidof bash
125591 88406 81122 19320

5.top:display Linuxprocesses,动态显示进程信息

格式:

top  [OPTION]

常用选项:

-d #:指定刷新时间间隔,默认为3秒;

-b:以批次方式显示;

-n #:显示多少批次;

-p PID:通过指定监控进程ID来仅仅监控某个进程的状态。

-c:显示整个命令行而不只是显示命令名

-i: 使top不显示任何闲置或者僵死进程

常用交互式命令:

(1)在top显示过程中通过交互式命令指定排序(默认CPU):

  • P: 按照CPU百分比大小将进程降序排序

  • M:Memory占用量大小将进程降序排序

  • T:CPU累积时间占用量将进程降序排序

(2)首部信息关闭

  • l: top行信息是否显示;

  • t:是否显示进程及CPU相关的信息

  • 1:是否单独显示每颗CPU的使用率

  • m: 是否显示内存及swap相关的信息

(3)其他命令

  • q: 退出top

  • s: 修改刷新时间间隔;

  • k: 杀死指定进程

  • L:搜索字符串

说明:

load avg:

CPU上等待运行的进程队列的队列长度;
过去1分钟、5分钟、15分钟的平均长度;

cpu(s)行解释:

us: user space,用户空间占用CPU百分比
sy: system,内核空间占用CPU百分比
ni: nice,用户进程空间内改变过优先级的进程占用CPU百分比
id: idle,空闲CPU百分比
wa: waiting io,等待输入输出的CPU时间百分比
hi: hardware interrupt,硬件CPU中断占用百分比
si: software interrupt,软件CPU中断占用百分比
st: stolen,虚拟机占用百分比

默认上,top显示这些关于进程的属性:

PID

进程ID,进程的唯一标识符

USER

进程所有者的实际用户名。

PR

进程的调度优先级。这个字段的一些值是'rt'。这意味这这些进程运行在实时态。

NI

进程的nice值(优先级)。越小的值意味着越高的优先级。

VIRT

进程使用的虚拟内存。

RES

驻留内存大小。驻留内存是任务使用的非交换物理内存大小。

SHR

SHR是进程使用的共享内存。

S

这个是进程的状态。它有以下不同的值:

D - 不可中断的睡眠态。
R – 运行态
S – 睡眠态
T – 被跟踪或已停止
Z – 僵尸态

%CPU

自从上一次更新时到现在任务所使用的CPU时间百分比。

%MEM

进程使用的可用物理内存百分比。

TIME+

任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。

COMMAND

运行进程所使用的命令。

还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。

实例:

[root@young ~]# top
top - 01:21:28 up 9 days, 19:36,  3 users,  load average: 0.07, 0.08, 0.06
Tasks: 419 total,   2 running, 417 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.6 us,  1.9 sy,  0.0 ni, 96.4 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3098484 total,   281664 free,   566888 used,  2249932 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  2393584 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                 
  6851 root      20   0       0      0      0 S  6.2  0.0   0:07.28 kworker/0:1                             
 84869 root      20   0  146412   2240   1368 R  6.2  0.1   0:00.01 top                                     
     1 root      20   0  128996   8856   1712 S  0.0  0.3   3:37.38 systemd

# top   //每隔3秒显式所有进程的资源占用情况
# top -d 2  //每隔2秒显式所有进程的资源占用情况
# top -c  //每隔3秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
# top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
# top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

更加详细内容: http://www.cnblogs.com/qiwenhui/articles/4262044.html

:VIRT=SWAP+RES

6.htop命令

需要安装(第三方安装包):

[root@localhost~]#  yum  install -y htop

(1)常用选项:

-d #:指定延迟时间间隔;

-u UserName:仅显示指定用户的进程;

-s COLUME:以指定字段进行排序;

(2)常用交互式命令:

l:显示选定的进程打开的文件列表;

s:跟踪选定的进程的系统调用;

t:以层级关系显示各进程状态;

u: 仅显示指定用户的进程

k:发送信号,15通常用来杀死命令,15不起作用可用用9信号

#:快速定位到PID为#的进程上

(3)显示描述

左上方数据:表示每颗CPU、内存、交换内存的使用率

右上方数据

  • Tasks:当前的任务数量,用户空间进程

  • thr:线程数量

  • running:运行的数量

  • Load average :过去一分钟、五分钟、十五分钟的平均负载

(4)支持鼠标操作的文本窗口

h命令获取帮助 

(5)获取支持排序字段

[root@young ~]# htop --sort-key=help 
PID
Command
STATE
PPID
PGRP
SESSION
TTY_NR
TPGID
FLAGS