一、进程的概念

 1、内核的公用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等

 2、Process(进程):运行中的程序的一个副本,是被载入内存的一个指令集合

   进程ID(process ID,PID)号码被用来标记各个进程    UID,GID和SELinux语境决定文件系统的存取和访问权限    通常从执行进程的用户来继承    存在生命周期

 3、Task struct(任务结构):Linux内核存储进程信息的数据结构格式

 4、Task list(任务列表):多个任务的task struct组成的链表

 5、进程的创建:

  系统中的第一个进程时所有的进程的父进程,其它进程都需要在它之下创建进程,与其它进程的关系是父子关系,进程都由其父进程创建第一个进程被杀死其它所有进程都会崩溃   Centos6与之前    Init:第一个进程   Centos7    Systemd:第一个进程

 6、进程优先级

  进程优先级:数字越小,优先级越高     0-139(centos 4,5)       各有140个运行队列和过期队列    0-98,99(centos6,7)   实时优先级:99-0 值越大优先级越高   Nice值:-20-19,对应系统优先级100-139或99

 7、Linux内核:抢占式多任务

 8、进程的类型

  守护进程:在系统引导过程中启动的进程,和终端无 关进程   前台进程:跟终端相关,通过终端启动的进程   注意:两者可互相转化

 9、进程状态

  运行态:running   就绪态:ready   睡眠态:可中断:interruptable       不可中断:uninterruptable   停止态:stopped,暂停于内存,但不会被调度,除非手动启动   僵死态:zombie,结束进程,父进程结束前,子进程不关闭

 10、进程的分类:

  CPU-Bound:CPU密集型,非交互   IO-Bound:IO密集型,交互

 11、Linux系统状态的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup

   pstree:显示进程树(以树状图的方式显示进程)    ps:查看进程状态    Linux系统各进程的相关信息均保存在/proc/PID目录下 的各文件中

二、查看进程ps

   ps [选项]    ps支持三种选项:     UNIX选项 如-A -e     BSD选项 如a     GNU选项 如--help    BSD方式     ps 单独一个ps显示当前终端上运行的所有进程     a 所有用户在所有终端上运行的前台进程     x 当前用户运行的所有进程(包括前台进程和后台daemon)     u 选项显示进程所有者的信息     k [属性]: 对属性排序;例:ps k %cpu 按CPU使用率排序
    - - sort [属性]: 对属性排序;例:ps - -sort %cpu
    ax 所有用户运行的所有进程     aux 所有用户运行的所有进程,结果中显示用户名     f 显示父子进程关系     -C <命令关键字> :用进程名进行过滤     axo配合     o [属性]:自定义输出列,可以跟多个属性,属性与属性之间以逗号分隔      %cpu:CPU使用率      %mem:内存使用率      pid:进程号      uid:进程的所属用户的ID号      user:进程所属主      gid:进程的所属组的组ID      group:进程所属组      cmd:命令的参数,命令的字符串;同args一样      comm:显示命令的名字      tty:显示执行终端      ruser:命令的发起人      euser :命令的真正执行行      vsz:虚拟内存集      rss:常驻内存集      stat:进程状态      ni: nice值        pri: priority 优先级       psr: processor CPU编号       rtprio: 实时优先级 这些属性就是显示的自定义的列信息,如下图红框所框之处    UNIX方式:     -a 所有用户在所有终端上运行的前台进程     -x 当前用户运行的所有进程(包括前台进程和后台daemon)     -ax 所有用户运行的所有进程     -aux 所有用户运行的所有进程,结果中显示用户名     -f 显示当前终端上运行的所有进程     -e 显示所有进程     -f 显示完整格式程序信息     -F: 显示更完整格式的进程信息     -H: 以进程层级格式显示进程相关信息(显示父子关系)     -ef 以完整格式显示所有进程     -eF 以更完整格式显示所有进程     -efH 显示父子进程关系     -eo 自定义显示结果,如下      ps -eo %cpu,%mem,pid,nice,pri,stat,comm,vsz,rss,stat

三、进程状态

  STAT :进程状态    R:running    S: interruptable sleeping    D: uninterruptable sleeping    T: stopped    Z: zombie    +: 前台进程    l: 多线程进程    L:内存分页并带锁    N:低优先级进程    <:高优先级进程    s: session leader,会话(子进程)发起者

四、进程优先级

  进程优先级调整    静态优先级:100-139     进程默认启动时的nice值为0,优先级为120     只有根用户才能降低nice值(提高优先性)   nice 命令:     nice [选项] pri [cmd [arg]] :在执行命令时设定它的nice值(pri:nice值;cmd:命令;arg:参数)   renice 命令    renice [-n] pri pid:重新设置一个进程的nice值(pri:nice值;pid:进程的进程号)   查看:    ps axo ni:查看nice值

五、搜索进程

  最灵活:ps 选项 |其他命令   按预定义的模式:pgrep(pgrep仅适用于匹配进程信息)    pgrep [option] pattern      -u uid: effective user,生效者      -U uid: real user,真正发起运行命令者     -t terminal: 与指定终端相关的进程     -l: 显示进程名
    -P pid: 显示指定进程的子进程   按确切的程序名称:/sbin/pidof     pidof bash :根据命令名来搜索出该命令的进程的pid(bash:命令名)

六、系统工具

  uptime    显示当前时间,系统已启动的时间、当前上线人数,系统平均负载(1、5、10分钟的平均负载,一般不会超过1)   系统平均负载:    指在特定时间间隔内运行队列中的平均进程数   通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题   如果Linux主机是1个双核CPU,当load average为6的时候说明机器已经被充分使用

七、进程管理工具top

  ps 这个工具查看进程只是临时的,只能查询出执行命令那一刻的所有进程,却不是实时刷新的,有些死板,下面介绍一个top工具,它可以实时查询进程信息,更加方便我们的管理

 1、使用top 的语法

    top [选项] [参数]      -d #:指定刷新时间间隔,#秒刷新一次,单位为秒,默认为3秒      -b:全部显示所有进程      -n # :刷新多少次后退出

 2、top:实时查看进程信息,有许多内置命令

   排序:      P:以占据CPU百分比,%CPU      M:占据内存百分比,%MEM      T:累积占据CPU时长,TIME+    首部信息显示:      l:uptime信息      t:tasks及CPU信息     1:CPU分别显示     m:memory信息(内存)     q:退出命令     s:修改刷新时间间隔     k:终止指定进程     W:保存文件

 3、栏位信息简介

   us:用户空间    sy:内核空间    ni:调整    nice时间    id:空闲    wa:等待IO时间    hi:硬中断    si:软中断(模式切换)    st:虚拟机偷走的时间

八、高级进程管理htop

  除了top外还有一个top的增强版命令htop,系统默认情况下没有安装,需要epel源来进行安装,这里不做epel的配置,直接通过yum install htop命令进行安装,安装后直接执行htop命令即可,htop较之top有了颜色,显示界面上也更加好看。

 1、htop [选项] [参数]

    -d #: 指定延迟时间;#秒后    -u UserName: 仅显示指定用户的进程    -s COLUME: 以指定字段进行排序

 2、htop模式下的子命令

   s: 跟踪选定进程的系统调用    l: 显示选定进程打开的文件列表    a:将选定的进程绑定至某指定CPU核心    t: 显示进程树    #:快速定位光标至PID为#的进程上    h:帮助信息,显示该模式下的所有子命令    q:退出

九、 动态显示系统资源的使用情况vmstat

  vmstat命令主要用来动态的显示当前系统资源的使用情况,也就是虚拟内存信息,这些资源包括:内存、磁盘、网络、cpu等资源。

 1、用法:vmstat [选项] [参数]

    -s:将一些时间导致的内存变化情况列表说明     -S:后面可以跟单位;如K、M取代bytes的容量;例:vmstat -S K     -d:列出磁盘的读写总量统计表     #1 #2:#1,#2是两个数字,#1秒刷新一次,刷新#2次,将刷新的当前系统资源的使用情况显示出来

2、每一行所代表的含义:

  procs:    r:可运行(正运行或等待运行)进程的个数,和核心数有关    b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)   memory:    swpd: 交换内存的使用总量    free:空闲物理内存总量    buffer:用于buffer的内存总量    cache:用于cache的内存总量   swap:    si:从磁盘交换进内存的数据速率(kb/s)    so:从内存交换至磁盘的数据速率(kb/s)   io:    bi:从块设备读入数据到系统的速率(kb/s)    bo: 保存数据至块设备的速率   system:    in: interrupts 中断速率,包括时钟    cs: context switch 进程切换速率   cpu:    us:user space,用户运行程序占用CPU的百分比    sy: system(kernel space),用于运行内核占用CPU的百分比    id: idle,空闲CPU百分比    wa: wait IO,等待I/O花费时间    st: stolen,被虚拟机‘偷走’的百分比

十、统计CPU和设备IO信息

  Iostat:统计CPU和设备IO信息    示例:iostat 1 10 :每一秒刷新一次统计出的CPU和设备信息,并显示10次后自动退出

十一、进程对应的内存映射

   pmap命令用来显示当前正在运行的某一个进程所对应使用的内存的映射    pmap [选项] PID [...]     -x:显示详细格式的信息   示例:pmap 1:显示进程号为1的进程对应的内存映射   另一种实现方法     cat /proc/PID/maps :PID为要查看的进程的PID

十二、系统监控工具glances

  glances是一款用于Linux、BSD的开源命令行系统监控工具,它使用Python语言开发,能够见识CPU、负载、内存、磁盘I/O、网络流量、文件系统、系统温度等信息,优点是glances可以实时的显示重要的系统信息,并每隔2秒动态刷新,它也不会消耗大量的CPU资源;但是glances在默认情况下并不会安装,需要自行安装,

 1、Glances可以为Unix和Linux性能专家提供监视和分析性能数据的功能,其中包括:

1.CPU使用率

2.内存使用情况

3.内核统计信息和运行队列信息

4.磁盘I/O速度、传输和读/写比率

5.文件系统中的可用空间

6.磁盘适配器

7.网络I/O速度、传输和读/写比率

8.页面空间和页面信息

9.消耗资源最多的进程

10.计算机信息和系统信息

 2、glances的使用方法及常用的选项

  -b: 以Byte为单位显示网卡数据速率   -d: 关闭磁盘I/O模块   -f /path/to/somefile: 设定输入文件位置   -o {HTML|CSV}:输出格式   -m: 禁用mount模块   -n: 禁用网络模块   -t #: 延迟时间间隔   -1:每个CPU的相关数据单独显示

 3、C/S模式下运行glances命令

   glances支持远程模式,即可以以C/S模式工作    服务器模式:      glances -s -B IP       IP:指明监听的本机哪个地址
   客户端模式:     glances -c IP       IP:要连入的服务器端地址

十三、系统资源统计

  dstat命令是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品,dstat可以实时的看到所有系统资源,以列表的形式为你提供选项信息并清晰地告诉你是在何种幅度和单位显示输出,默认情况下每秒刷新一次,并显示结果Ctrl+C退出,dstat在centos6和centos7系统上默认情况下是没有被安装的,需要自行安装后使用

 1、dstat命令的选项

  短选项     -c: 显示cpu相关信息     -C #,#,...,total     -d: 显示disk相关信息     -D total,sda,sdb,...     -g:显示page相关统计数据     -m: 显示memory相关统计数据     -n: 显示network相关统计数据     -p: 显示process相关统计数据     -r: 显示io请求相关的统计数据     -s: 显示swapped相关的统计数据   长选项     - -tcp:显示tcp套接字的相关的数据     - -udp:显示udp套接字的相关的数据     - -unix:显示unix sock接口相关的统计数据     - -raw:显示raw套接字的相关的数据     - -socket:     - -ipc:显示进程间通信相关的速率数据     - -top-cpu:显示最占用CPU的进程      - -top-io: 显示最占用io的进程      - -top-mem: 显示最占用内存的进程      - -top-latency: 显示延迟最大的进程

 2、dstat命令显示的每一行信息

  Total-cpu-usage:cpu的使用率   Dsk/total:磁盘读写速度   Net/total:网络设备发送和接收的数据总数   Paging:系统的分页活动,分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正字使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0.   System:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。服务器一般情况下都会运行一些程序,所以这项总是显示一些数值。

十四、进程管理工具kill

  所谓进程管理就是向进程发送一些控制信号,来完成对进程的管理控制,我们可以通过kill 命令来显示当前系统可用的信号,以及向进程发送信号指令

 1、显示当前系统可用信号

   kill -l :显示当前系统可用信号    trap -l:显示当前系统可用信号
  常用的信号:    SIGHUP:1, 无须关闭进程而让其重读配置文件    SIGINT:2, 中止正在运行的进程;相当于Ctrl+c    SIGQUIT:3,相当于ctrl+\    SIGKILL:9, 强制杀死正在运行的进程    SIGTERM:15,终止正在运行的进程    SIGCONT:18,继续运行    SIGSTOP:19,后台休眠

 2、指定信号的方法

  1.完整名称,例如SIGINT

  2.简写名称,例如INT

  3.数据代称,例如2

 3、指定进程的方法

  1.按PID:kill [-SIGNAL] pid

    仅能管理一个进程

  2.按名称:killall [-SIGNAL] cmd

   可以管理所有的关于cmd的进程,包括不同终端的cmd进程

  3.按模式:pkill [-SIGNAL] [选项] pattern

    -SIGNAL(可以省略,省略时默认为9 SIGKILL)    选项     -u uid: 生效者的进程     -U uid: 真正发起运行命令者的进程     -t terminal: 与指定终端相关的进程,例:pkill -t pts/1     -l: 显示进程名(pgrep可用)     -a: 显示完整格式的进程名(pgrep可用)     -P pid: 显示指定进程的子进程

十五、作业管理

 1、Linux的作业控制

  前端作业:通过终端启动,且启动后一直占据终端 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

 2、让前台作业运行于后台

  1.运行中的作业:Ctrl +Z(中断进程,使其不再运行,但依然在后台有这个进程)   2.尚未启动的作业:cmd &(在后台执行该命令,但是依然在终端上显示执行结果,但不影响在终端上输入其他命令并执行)   后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业,如果希望送往后台且剥离与终端的关系.    nohup COMMAND &>/dev/null &     screen;COMMAND

 3、查看当前终端所有作业:jobs

 4、作业控制:

  fg [[%]JOB_NUM]:把指定的后台作业调回前台   bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行   kill [%JOB_NUM]: 终止指定的作业(JOB_NUM:作业号)

 5、并行运行多个进程,提高效率

  方法1    把其它需要运行的所有命令编辑到多个脚本中,然后在编辑一个脚本,在这个脚本里执行所有的脚本      vim all.sh      F1.sh&      F2.sh&      F3.sh&   方法2    编写多个脚本,在命令行中写一行一次性执行所有的脚本      (f1.sh&);(f2.sh&);(f3.sh&)   方法3     { f1.sh& f2.sh& f3.sh& }