天天看点

Linux下的进程管理

    在操作系统系统中,进程是一个非常重要的概念。

一、Linux中进程的相关知识

1、什么是进程呢?

    通俗的来说进程是运行起来的程序。唯一标示进程的是进程描述符(PID),在linux内核中是通过task_struck和task_list来定义和管理进程的。

2、进程的分类

    1)根据在linux不同模式下运行分为:

        核心态:这类进程运行在内核模式下,执行一些内核指令(Ring 0)。

        用户态:这类进程工作在用户模式下,执行用户指令(Ring 3)。

    如果用户态的进程要执行一些核心态的指令,此时就会产生系统调用,系统调用会请求内核指令完成相关的请求,就执行的结果返回给用户态进程。

    2)按照进程的状态可分为:

        运行态:running 正在运行的进程

        可中断睡眠态:进程处于睡眠状态,但是可以被中断

        不可中断的睡眠态:进程处于睡眠状态,但是不可以被中断

        停止态:stoped 不会被内核调度

        僵死态:zombie产生的原因是进程结束后,它的父进程没有wait它,所导致的。

    3)按照操作的密集程度

        CPU密集型:进程在运行时,占用CPU时间较多的进程。

        I/O密集型:进程在运行时,占用I/O时间较多的进程。

    通常情况下,I/O密集型的优先级要高于CPU密集型。

    4)按照进程的处理方式

        批处理进程:

        交互式进程:

        实时进程:

3、进程的优先级

    进程的有优先级,是用0-139数字来表示的,数字优先级从小到大依次是:0-99,139-100。

    优先级分为2类:

        实时优先级:0-99,是由内核维护的

        静态优先级:100-139,可以使用nice来调整,nice值的取值范围是[-20,19),分别对应100到139。nice默认值是0。

        动态优先级:由内核动态维护,动态调整。

二、进程的管理工具

1、pstree命令 查看进程数。 常用用法如下:

<a href="http://s3.51cto.com/wyfs02/M01/3F/A5/wKioL1PLqdyyIb19AAEMNH_9wPY525.jpg" target="_blank"></a>

2、ps 命令 查看进程的相关状态。支持SysV和BSD两种风格的选项。

    常用选型:

        a  与终端相关的进程

        x  与终端无关的进程

        u  显示运行进程的用户

    常用组合选项:ps aux

<a href="http://s3.51cto.com/wyfs02/M00/3F/A5/wKiom1PLsWrBbbpGAAMO4REz0So556.jpg" target="_blank"></a>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code># 下面分别来说明上图的各个字段的含义</code>

<code># USER   进程以什么用户身份运行</code>

<code># PID    进程描述符 具有唯一性</code>

<code># %CPU   进程运行时所占的cpu百分比</code>

<code># %MEM   进程运行时内存所占的百分比</code>

<code># VSZ    Virtual memory SiZe 虚拟内存使用大小</code>

<code># RSS    常驻内存集,所有不能被置换出去的内存集</code>

<code># STAT   表示内存状态</code>

<code>#    常用的状态有:</code>

<code>#    S:可中段睡眠状态</code>

<code>#    R:运行态</code>

<code>#    D:不可中断睡眠态</code>

<code>#    T:停止态</code>

<code>#    Z:僵尸态</code>

<code>#    s:session leader 所谓进程的领导者</code>

<code>#    +:表示是前台进程</code>

<code>#    l:多线程进程</code>

<code>#    N:低优先级进程</code>

<code>#    &lt;:高优先级进程</code>

<code># TTY 用来表示终端 显示为“?”的说明是与终端无关的进程</code>

<code># START 进程开始时间</code>

<code># TIME 进程运行时间</code>

<code># COMMAND 执行进程的命令 如果命令被 "[]"包围,说明是内核线程</code>

        -e 显示所有进程

        -f 显示完成格式信息

    常组合在一起使用:ps -ef

<a href="http://s3.51cto.com/wyfs02/M01/3F/A5/wKiom1PLtv3AM8G8AAIzFXcrn_M342.jpg" target="_blank"></a>

    但是有些这种情况下,我们的命令有时候显示不完整

<a href="http://s3.51cto.com/wyfs02/M02/3F/A5/wKioL1PLt_HRegDWAAFNVp3t6Hw292.jpg" target="_blank"></a>

    此时想要显示完成就要 ps -efww

<a href="http://s3.51cto.com/wyfs02/M01/3F/A5/wKioL1PLuLPhBEpsAAIah-16qRE706.jpg" target="_blank"></a>

        -F:显示额外信息

        -H:显示进程的层次结构

    常用组合方式:ps -eFH

<a href="http://s3.51cto.com/wyfs02/M01/3F/A5/wKiom1PLuWaShIYVAAHLO4AzcZA175.jpg" target="_blank"></a>

    可能以后我们用到最多的选项:

        -o 我们可以自定义显示字段

<code># 常用的有:</code>

<code># pid    command    psr    pri    ni    %cpu     %mem    rsz    vsz等</code>

3、pgrep,pidof

    pgrep 常用选型:

        -U 查看指定用户的进程号

        -G 查看指定用户组的进程号

        -l 显示进程名和进程号

<a href="http://s3.51cto.com/wyfs02/M02/3F/A6/wKioL1PLvhCQMqZ0AAD7aQPiG9s329.jpg" target="_blank"></a>

    pidof:只显示已启动进程的PID

<code>[root@server ~]</code><code># pidof httpd # 没启动的进程不显示</code>

<code>[root@server ~]</code><code># pidof man</code>

<code>5283</code>

4、top命令

    实时监控系统资源

<code># 执行top命令后,进入交互式模式</code>

<a href="http://s3.51cto.com/wyfs02/M02/3F/A6/wKiom1PLwTvzUMNsAASsHaYJe14951.jpg" target="_blank"></a>

24

25

26

27

28

29

30

31

32

<code># top中的一些交互式命令:</code>

<code># l:控制是否显示第一行,负载均衡信息</code>

<code># t:控制是否显示进程信息由和cpu信息</code>

<code># m:控制是否显示内存,交换信息</code>

<code># I 或者 1(数字):是否分别显示cpu每个信息</code>

<code># M: 按%mem排序显示,从大到小</code>

<code># k: kill 杀掉进程</code>

<code># s:修改默认刷新时间 默认是3秒</code>

<code># 下面解释抬头信息:</code>

<code>top</code> <code>- 21:35:17 up 10:03,  4 </code><code>users</code><code>,  load average: 0.00, 0.00, 0.00</code>

<code>#   系统时间   启动时间 登录用户数    负载均衡:1min 5min 15min</code>

<code># 何为系统负载?在这里指的是等待在进程队列里的平均进程数</code>

<code># 此出显示的信息 等价于 uptime 命令</code>

<code>Tasks: 165 total,   1 running, 164 sleeping,   0 stopped,   0 zombie</code>

<code># 进程总数            运行数     睡眠态数        停止态数    僵尸进程数</code>

<code>Cpu(s):  0.0%us,0.0%sy, 0.0%ni, 100.0%</code><code>id</code><code>, 0.0%wa, 0.0%hi, 0.0%si,  0.0%st</code>

<code># 0.0%us:user space:用于运行用户空间的程序所占的cpu百分比 </code>

<code># 0.0%sy:system space:用于运行内核空间的程序所占的cpu百分比   </code>

<code># 0.0%ni:nice值调用时间所占cpu百分百比</code>

<code># 100.0%id:系统cpu空闲所占百分比</code>

<code># 0.0%wa:用于等待I/O所占的cpu百分比</code>

<code># 0.0%hi:硬中断所占cpu百分比</code>

<code># 0.0%si:软中断所占cpu百分比</code>

<code># 0.0%st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu</code>

<code>Mem:   1012548k total,   396328k used,   616220k </code><code>free</code><code>,    99444k buffers</code>

<code>#       总内存大小     使用的内存大小    剩余内存大小    缓存的大小</code>

<code>Swap:  2097144k total,        0k used,  2097144k </code><code>free</code><code>,   144156k cached</code>

<code>#    交换分区总大小        使用的        剩余的            缓冲大小</code>

<code># 此处显示的信息等价于 free 命令</code>

    常用选项:

        -d #: 指定刷新时间间隔

        -b: 以批次的方式显示top的刷新

        -n #: 显示的批次

例如:top -d 4 -b 2 -n 3

4、htop

    htop命令是top命令的升级版,无论是在功能上还是在界面显示上,都比top命令更胜一筹。

        u: 交互式选择显示指定用户的进程

        l: 显示光标所在进程所打开的文件列表

        s: 显示光标所在进程执行的系统调用

        a: 绑定进程到指定的CPU

        #:快速定位光标至PID为#的进程上

    下图是htop的界面。这个工具比较强大,用法功能比较多,在这里先做简单介绍。以后笔者会专门写htop的博客。

<a href="http://s3.51cto.com/wyfs02/M00/3F/A7/wKiom1PL1jHCpKO4AATAgaiStJA686.jpg" target="_blank"></a>

5、vmstat

    wmstat 查看虚拟使用情况

33

34

35

36

37

38

39

40

41

<code># 常用用法:</code>

<code># vmstat 显示信息会默认1秒刷新一次,一直显示</code>

<code># vmstart -n 2 显示信息会2秒刷新一次,一直显示</code>

<code># vmstat  -n 1 4 显示信息会1秒刷新一次,刷新4次</code>

<code>[root@server ~]</code><code># vmstat -n 1 1</code>

<code>procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----</code>

<code> </code><code>r  b   swpd   </code><code>free</code>   <code>buff  cache   si   so    bi    bo   </code><code>in</code>   <code>cs us sy </code><code>id</code> <code>wa st</code>

<code> </code><code>0  0      0 614392 100468 144776    0    0     2     1    6    5  0  0 100  0  0</code>

<code> </code> 

<code># 我们解释一下每个字段的含义:</code>

<code># procs字段 关于进程的</code>

<code># r    指运行队列的进程数,如果过长,可能是cpu性能较低</code>

<code># b    阻塞队列的长度,通常是用于等待I/O的完成。如果太大,说明I/O性能较低</code>

<code># memory字段 关于内存使用的</code>

<code># swap 使用的交换内存大小</code>

<code># free 空余内存大小  它的值=总大小-buff-cache-used</code>

<code># buff 缓冲大小,目的是为了加速I/O的写操作(一般是磁盘)</code>

<code># cache 缓存大小,摸底是为了加速I/O的读操作(一般是磁盘)</code>

<code># swap字段 说明交换内存</code>

<code># si swapin 指的是数据进入交换内存的速率 单位:KB/s</code>

<code># so swapout 指的是数据出交换内存的速率 单位:KB/s</code>

<code># 如果这2个值比较大的时候,会出现抖动现象。建议增加内存</code>

<code># io字段  I/O的说明</code>

<code># bi:Block in 从块设备读入内存的速率 KB/s</code>

<code># bo: block out 保存到块设备的速率 KB/s</code>

<code># 这就是我们通常说的磁盘的读写性能,可以通过RAID提高。</code>

<code># system字段 关于系统的</code>

<code># in: interruppt 中断发生的速率</code>

<code># cs: 上下文切换的速率(进程调度)</code>

<code># cpu字段 说明cpu的使用情况</code>

<code># us:user space:用于运行用户空间的程序所占的cpu百分比</code>

<code># sy:system space:用于运行内核空间的程序所占的cpu百分比   </code>

<code># id:系统cpu空闲所占百分比</code>

<code># wa:用于等待I/O所占的cpu百分比,这是由于cpu和i/o速度相差太多所造成的</code>

<code># st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu的时间百分比</code>

6、nice,renice

    调整进程的优先级。

    nice 在进程启动的时候设置优先级。

<code># 常用参数:</code>

<code># -n NICE 例如:nice -n 3 httpd</code>

<code># 一般情况下,nice值是负值的设定一般有管理员来设定。普通用户只能设置nice为正值。</code>

<code># 如果不指定 -n 参数,默认的nice值是10</code>

    renice 重新设置已启动进程的优先级。

<code># 常用选项是:</code>

<code># -n NICE 重新设定nice的值 </code>

<code># -p PID  设定进程的PID</code>

7、kill,killall

    对于有Linux C编程经验的人来说,我们知道IPC通信方式之一就是通过信号量(signal),那么对于kill和killall命令来说,它们与信号量有着很大的关系,或者说kill,killall命令通过信号量让我们可以手动的向进程传递信号来控制进程。

    常见的信号量如下:

<code>[root@server ~]</code><code># kill -l</code>

<code> </code><code>1) SIGHUP     2) SIGINT     3) SIGQUIT    4) SIGILL     5) SIGTRAP</code>

<code> </code><code>6) SIGABRT    7) SIGBUS     8) SIGFPE     9) SIGKILL   10) SIGUSR1</code>

<code>11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM</code>

<code>16) SIGSTKFLT  17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP</code>

<code>21) SIGTTIN    22) SIGTTOU    23) SIGURG 24) SIGXCPU    25) SIGXFSZ</code>

<code>26) SIGVTALRM  27) SIGPROF    28) SIGWINCH   29) SIGIO  30) SIGPWR</code>

<code>31) SIGSYS 34) SIGRTMIN   35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3</code>

<code>38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8</code>

<code>43) SIGRTMIN+9 44) SIGRTMIN+10    45) SIGRTMIN+11    46) SIGRTMIN+12    47) SIGRTMIN+13</code>

<code>48) SIGRTMIN+14    49) SIGRTMIN+15    50) SIGRTMAX-14    51) SIGRTMAX-13    52) SIGRTMAX-12</code>

<code>53) SIGRTMAX-11    54) SIGRTMAX-10    55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7</code>

<code>58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2</code>

<code>63) SIGRTMAX-1 64) SIGRTMAX  </code>

<code># 我们常用到的信号是:</code>

<code># 1 SIGHUP  在不关闭进程的情况下,重读配置文件。ngnix在这方面做得相当的好,甚至可以实现在线升级。</code>

<code># 2 SIGINT  中断信号 相当于 ctrl + C </code>

<code># 9 SIGKILL  暴力杀死</code>

<code># 15 SIFTERM 优雅的关闭  默认是这种情况</code>

<code># kill用法如下:</code>

<code># kill [-SIGNAL] PID</code>

<code># 对于SIGNAL有三种表示:例如:1) -9 -15 -1 -2   2)-SIGKILL -SIGHUP -SIGTERM   3) -HUP -KILL -TERM -INT 等。</code>

<code># </code>

<code># killall是杀掉一类进程</code>

<code># 例如:killall httpd 等价于 kill `pidof httpd`</code>

8、jobs,bg,fg

    什么是作业呢?作业就是许多进程一起协同完成一项具体的工作。作业有前台作业和后台作业2种。

    使用 &amp; 或者 ctrl + Z可以把一个进程打入后台。

<code># ping 192.168.0.1 &amp;</code>

<code># 这样打入后台的运行的作业,退出终端的时候,作业就会终止。</code>

<code># 使用 nohup 命令可避免这个问题</code>

<code># nohup ping 192.168.0.1 &amp;</code>

<code># 可以使用jobs命令查看后台的作业</code>

<code># 每个作业都有一个作业号来标识作业</code>

<code># 作业控制命令</code>

<code># bg [[%]JOB_NUM]:   让送往后台的作业继续在后台运行 </code>

<code># fg [[%]JOB_NUM]:   将后台作业调回前台</code>

<code># kill %JOB_NUM:     终止指定的作业</code>

 9、dstat命令,查看各种状态信息

    用法:dstat [-afv] [options..] [delay [count]]

常用参数

具体意义

-c

显示cpu统计数据,如有多个CPU汇总统计

-d

显示disk统计数据,如有多块磁盘则汇总统计

-D DEVICE

显示特定磁盘的信息

-g

显示page信息(具体什么是page以及他的作用,会在以后内存调优博客中具体说明)

-i

显示中断的统计数据

-m

显示内存的统计信息

-l

显示系统的负载信息

-n

显示网络接口的相关属性

-s

显示系统属性

-N INTER_FACE_NAME

显示特定接口的属性

显示交换内存的属性

-p

显示进程队列

--ipc

显示ipc消息队列、信号量和共享内存的使用状况

-a

等价于 -cdngy 显示CPU,磁盘,网卡,page,系统属性

-f

以完整格式显示所有信息,

--tcp,--udp

显示tcp,udp状态信息

    更多参数查看 man 手册。

示例:

<a href="http://s3.51cto.com/wyfs02/M00/40/DF/wKioL1PPjaLSKNvDAAIC62HqoLo613.jpg" target="_blank"></a>

10、查看内存映射

    pmap PID 查看对应进程的内存映射,常用的用法是:pman `pidof PROCESS_NAME`。当然这些信息也可以查看 /proc/PID/pmap 文件查看。

<a href="http://s3.51cto.com/wyfs02/M01/40/E6/wKioL1PPlxuwUs3qAASA-p7eoQo539.jpg" target="_blank"></a>

11、glances命令

    一款强大的系统监控工具:能实时监控像cpu,meomory,load,swap,Network,mount,disk等信息。

    其他功能的使用,请使用 h 来获取帮助。由于此工具比较强大,因此这里者简单的介绍,后期会于 htop 工具做专门的介绍。

    总结:本文主要进程管理的基本知识和管理工具。管理工具有:pstree,pgrep,pidofps,top,htop,vmstat,nice,renice,kill,killall,jobs,bg,fg,dstat,pmap,glances。

本文转自 羊木狼 51CTO博客,原文链接:http://blog.51cto.com/guoting/1440640,如需转载请自行联系原作者

继续阅读