Linux学习21-进程管理

进程管理

1. 进程概述

触发任何一个事件时,系统都会将他定义为一个进程,并给与这个进程一个ID,称为PID,同时依据启发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设定

  • 进程与引用程序的关系
    应用程序表现为磁盘可执行文件,运行程序时,系统就会读取该文件到内存中,占用一定的空间,系统会分配一定的资源给他来进行执行,而放到内存中,这个正在执行的程序就成是进程

    1. 进程是动态的概念,程序是静态的文件
    2. 一个程序可以开启多个进程
    3. 进程是有生命周期的
  • 软件程序管理
    内核创建第一个进程,称为初始进程CentOS6中叫init,CentOS7中叫systedmd。该进程可在系统上启动所有其他进程。内核每启动一个其他进程,都将在虚拟内存中为其分配一个唯一的空间,用于储存该进程使用的数据和代码

    1. task struct:Linux内核存储进程信息的数据结构格式,包括元数据与程序数据
    2. task list:多个任务的task struct组成的链表
  • 子进程与父进程
    当我们执行一个程序,比如/bin/bash时,会取得一个具有PID号码的进程,当这个进程进行其他作业时,这些其他作业也会触发成一个具有PID号码的进程,这个后来产生的PID就是子进程,而原本的bash环境中,就称为父进程

    • 进程与线程

      1. 进程(precess):都由其父进程创建可能会调用函数,用fork()或者clone() 来实现,CoW(写时复制copy or write当一个进程创建时,系统内存中暂时不会分配空间,指向的还是父进程的内存空间,当子进程的内容发生修改时,才会复制父进程的内存空间,建立新的。),相当于一个整体的任务,要完成这个任务要相关的人员、资源的集合。进程之间除父子关系,不共享资源,彼此间是不影响的。

      2. 线程(thread) :{}就是进程需要的人员,一个进程最少有一个线程,可以多个。
        在一个进程中的线程之间相互访问,资源是共享的。所以,有一个线程出问题,会互相影响其他线程。线程相对轻量化,占用的资源比进程少

      3. 示例:实际应用中比较,web server 多人访问服务

        1. 第一种做法:由一个父进程生成多个子进程去响应远程客户端的请求,服务于用户,如果有100个用户就会生成100个子进程,占用资源多;优点是进程间互不影响,相对稳定

        2. 第二种做法:总进程开启若干子进程,由子进程开启若干线程,用户的请求由线程来提供服务,线程占用的资源较少;其中一个线程如果出问题,可能会影响其他线程,不稳定

  • 时间片
    一个cpu只能同时做一件事,有2个用户,就会将执行时间切成时间片,每个时间片很短,每个用户执行一个时间片,跳到另一个用户再执行一个,循环执行,因为时间片时间很短,所以用户不易分辨。由于来回执行程序,需要保存原来的状态,这个过程就叫做进程的上下文切换,会带来资源消耗

2. 进程的基本状态和转换

这里写图片描述

  • 进程的基本状态

    1. 创建状态
      进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态

    2. 就绪状态
      进程已准备好,已分配到所有资源,只要分配到CPU就能立即运行,类似队列,等待执行

    3. 执行状态
      进程处于就绪状态被调度后,进程进入执行状态,执行时间由时间片控制,当时间片用完,就会释放CPU回到就绪队列状态,整个任务结束后,就会释放CPU,退出

    4. 阻塞状态
      收到I/O请求,需要从磁盘读数据到内存,而进程暂时无法收到数据, 进程暂停运行,受到阻塞,在满足请求时进入就绪状态等待系统调用

      1. PIO : 应用程序的输入输出
        只要出现存储设备与内存数据之间的交换 都要经过CPU
      2. DMA:内存的直接访问,
        CPU发送读取指令到DMA后,就可以挂起或执行其他指令,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
    5. 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
  • 状态之间转换六种情况

    1. 运行→就绪

      1. 主要进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的
      2. 在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
    2. 就绪→运行
      运行的进程额时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

    3. 运行→阻塞
      正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发了I/O请求

    4. 阻塞→就绪
      进程所等待的时间已经发生,就进入就绪队列

    5. 以下两种状态是不可能发生的

      • 阻塞→运行
        即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
      • 就绪→阻塞
        就绪状态根本就没有执行,谈不上进入阻塞态

3. 进程优先级

这里写图片描述

  • 优先级分类
    1. 系统优先级:数字越小,优先级越高
      0-139(centos4,5)
      0-98,99(centos6)
    2. 实时优先级:
      99-0 值最大优先级最高
    3. nice值:
      -20到19,对应系统优先级100-139或99
      PS:centos6中nice值在99-99之间,
  • 队列优化
    判断进程的优先级时,如果一个个去比较,是很费时间的,系统的解决方式为建立系统队列与等待队列
    1. 运行队列
      根据优先级,分出140个运行队列,将同级别的进程放在一个队列中,cpu处理进程时,从高优先级依次执行
    2. 等待队列
      在同一级别处理进程时,将超过时间片的进程放入等待队列,运行队列与等待队列来回切换,直到将次运行队列处理完。

4. 进程内存

  • 物理地址空间和线性地址空间

    1. 物理地址空间
      一个应用程序运行,内存会分配一块空间,它实际占用的内存空间
    2. 线性地址空间
      对应用程序而言,它认为所占用的是所有内存的空间,他会映射一个线性的虚拟空间,当应用程序运行时,希望从虚拟内存读数据,虚拟空间在实际内存中有映射关系
  • Page Frame
    页框,用存储页面数据,储存Page 4k ,类似于磁盘的块

  • LRU:
    Least Recently Used近期最少使用算法,释放内存 分配内存使用的算法。将近期不用的数据,逐渐淘汰掉
  • MMU
    Memory Management Unit 负责转换线性和物理地址
  • TLB
    Translation Lookaside Buffer 翻译后备缓冲器,用于保存虚拟地址和物理地址映射关系的缓存

5. 进程之间通讯

IPC:Inter Process Communication

  • 同一主机:signal:信号 命令kill –l 查看信号类型

    1. shm:shared memory 共享内存空间,将想要交换的数据放入共享内存,从共享内存中取就可以
    2. semaphore:信号量,信号量是一个非负整数,所有通过它的线程都会将该整数减一,当该整数值为零时,所有试图通过它的线程都将处于等待状态
  • 不同主机:socket:IP和端口号
    RPC:remote procedure call 应用层 远程过程调用,
    MQ:消息队列,Kafka,ActiveMQ 应用层

6. 进程状态

  • 进程执行效果分类:
    1. 守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程,不占用资源
    2. 前台进程:跟终端相关,通过终端启动的进程
      注意:两者可相互转化
  • 进程状态:
    1. 运行态:running
    2. 就绪态:ready
    3. 睡眠态:可以将来还原的
      • 可中断:interruptable 人为干预,交互式
      • 不可中断:uninterruptable 系统激活
    4. 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
    5. 僵死态:zombie,结束进程,父进程结束前,子进程不关闭。

7. 系统管理工具

Linux系统各进程的相关信息均保存在/proc/PID目录下的个文件中,文件中每个数字对应一个进程

7.1 pstree命令

将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程

  • 格式:pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
  • 选项:

    - p:显示线程
    -V:显示版本信息
    -a :显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
    -c:不使用精简标示法。
    -G:使用VT100终端机的列绘图字符。
    -h:列出树状图时,特别标明执行的程序。
    -l:采用长列格式显示树状图。
    -n:用程序识别码排序。预设是以程序名称来排序。
    -p:显示程序识别码。
    -u:显示用户名称。
    -U:使用UTF-8列绘图字符。
    -V:显示版本信息。

  • 示例
    1. 显示指定用户进程
    $pstree -u v9
    `
    2. 显示进程间的关系

    $pstree -apnh

7.2 PS命令

显示当前进程状态的快照,非动态跟踪

  • 格式:
    ps [OPTION]…
    默认显示当前终端中的进程
  • 支持三种选项:

    1. UNIX选项

          -C   cmdlist指定命令的进程,多个命令用,分隔
          -L   显示线程
          -e   显示所有进程,相当于-A
          -f   显示完整格式程序信息
          -F   显示更完整格式的进程信息
          -H   以进程层级格式显示进程相关信息,父子关系
          -u   userlist指定有效的用户ID或名称EUID
          -U   userlist指定真正的用户ID或名称RUID
          -G   gid或groupname指定有效的gid或组名称
          -g   gid或groupname指定有效的gid或组名称
          -p   pid显示指pid的进程
          -M   显示SELinux信息,相当于Z
      
    2. BSD选项 如a

          a   选项包括所有终端中的进程
          x   选项包括不链接终端的进程,和终端无关的也会显示
          u   选项显示进程所有者的信息    有UID权限时为生效的用户(euser),一般情况为程序发起者(ruser)   
          f   选项已进程树显示,相当于 --forest
          k   属性对属性排序,属性前加- 表示倒序,在6中无效
          o    属性...选项显示定制的信息pad、cmd、%cpu、%mem、euser
          L   显示支持的属性列表
      
    3. GUN选项

          --sort
          --ppid pid   显示属于pid的子进程
      
  • 输出属性
    在命令行执行ps -aux,输出结果如下:

    $ps -aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          2  0.0  0.0      0     0 ?        S    10:16   0:00 [kthreadd]
    
    1. %MEM:内存占用百分比
    2. %CPU:cup占用率
    3. VSZ:Virtual memory SiZE,虚拟内存集,线性内存
    4. RSS:ReSident Size,常驻内存集,物理实际使用内存数
    5. TTY:终端
    6. START:进程开启时间
    7. C:cup利用率,以整数表示
    8. COMMAND: 命令;[ ]中的进程表示该进程不活动,已经从内存换出到磁盘交换空间
    9. STAT:进程状态
      1. R:running
      2. sw:表示休眠并等待
      3. S:interruptable sleeping 可中断的休眠
      4. D:uninterruptable sleeping 不可中断的休眠
      5. T:stopped 停止态
      6. Z:zombie 僵尸态
      7. +::前台进程
      8. l:多线程进程
      9. L:内存分页并带锁
      10. N:低优先级进程
      11. <:高优先级进程
      12. s:session leader,会话(子进程)发起者
  • 可定制信息,o选项,可通过L选项查看所有支持属性,常用有

    1. pri:priority优先级
    2. ni:nice值
    3. psr:processor CPU编号

      1:$taskset -p 8153        <==显示进程绑定的cpu
         pid 8153's current affinity mask: 1       <==表示在第1个cpu上运行,对应的绑定编号为0
      2:$taskset  -cp  1  8153   <==绑定进程在2号cpu上
      3:$taskset -p 8153
        pid 8153's current affinity mask: 2     <==表示在第2个cpu上运行
      
    4. comm:command指令
    5. rtprio:实时优先级
    6. %mem:内存占用率
    7. %cpu:cpu占用率
  • 示例

例一:ps命令显示定制属性

$ps  ao  pid,cmd,psr,ni,pri,rtprio,ni
   PID CMD                         PSR  NI PRI RTPRIO  NI
  2192 bash                          2   0  19      -   0
  2618 -bash                         5   0  19      -   0

例二:运行程序并指定nice优先级为10

$nice  -n 10  sleep 100  

例三:程序执行后,更改优先级

renice -n -10   2199

例四:查询某个命令的进程

$ps -C nano
   PID TTY          TIME CMD
  8153 pts/1    00:00:00 nano

例五:以父进程ID来显示其下所有的进程,如显示父进程为1154的所有进程
ps -f --ppid 1234

例六:要显示一个进程的所有线程,将显示LWP(轻量级进程)以及NLWP(轻量级进程数)列:
ps -fL -C nginx

例七:查找指定进程名所有的所属PID,在编写需要懂std输出或文件读取PID的脚本时这个参数很有用:
ps -C httpd,sshd -o pid

7.3 搜索进程命令

7.3.1 命令pgrep

  • 格式:
    pgrep [options] pattern 支持正则表达式
  • 选项:
    -u : effective user,生效者
    -U : real user,真正发起运行命令者
    -t :与指定终端相关的进程
    -l :显示进程名
    -a:显示完整格式的进程名
    -P:显示指定进程的子进程

  • 示例:模糊查找指令nano的进程编号

$pgrep -a ^nan*
1964 nautilus-desktop --force
8153 nano

7.3.2 命令pidof

可以显示进程名称对应的进程ID号
可以根据$?返回值,判断进程状态
- 格式:pidof [cmd]
- 示例
$pidof httpd
4210 4209 4208 4207 4206 3994

7.4 命令uptime

显示当前状态的静态指令

$uptime
 20:53:34 | up 10:36, | 4 users, | load average: 0.00, 0.01, 0.05
 当前时间  |系统运行时间|当前有多少用户|负载情况:1,5,10分钟平均值
  • 系统平均负载
    1. 指在特定时间间隔内运行队列中的平均进程数
    2. 通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好
    3. 每个CPU内核的任务数大于5,那么次主机的性能有严重问题
    4. 如果是双核CPU,当Load Average为6时候说明机器已经被充分使用

7.5 命令top

动态监控系统状态 ,在命令行输入top,界面如下

  • 格式:
    top [选项]
  • 选项:
    -p:指定进程
    -b:全部显示所有进程
    -H : 线程模式,示例:top -H -p 5155
    -n#:刷新多少次后退出
    -d#:指定刷新时间间隔,默认为3秒
#top
1. |top - 21:01:47 up 10:45,  4 users,  load average: 0.04, 0.03, 0.05|
   |uptime信息|
2. |Tasks: 259 total, |  1 running, |258 sleeping, |  0 stopped, |  0 zombie
   |  总进程数         |   活动进程   |   睡眠进程    |   停止进程  |  僵尸进程|
3. |%Cpu(s): | 0.1 us, | 0.2 sy, |       0.0 ni,        | 99.8 id,| 0.0 wa, | 0.0 hi, | 0.0 si, | 0.0 st|
   | cpu状态 |用户占用比例|内核占用|改变过ni优先级的进程占用| 空闲占比 |等待IO时间|  硬中断  |软终端|丢失的时间片|
4. |KiB Mem :  1514076 total, |   76768 free, |  791284 used, |  646024 buff/cache|
    |            总内存        |     剩余量    |     使用量     |用于缓存的量|
5. |KiB Swap:  3145724 total, | 3145724 free, |       0 used. |  503752 avail Mem |
   |        虚拟内存总量       |      空闲量    |     使用量    |缓冲的交换区总量|
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                          
   742 root      20   0  320060   6536   5072 S   0.3  0.4   0:49.45 vmtoolsd  
  • 首部信息显示隐藏开关
    st:丢失的时间片,系统识别虚拟机,但不会识别虚拟机中运行的,cpu会分配给虚拟机中一些进程用,就会产生未知时间片
    1. uptime信息:开关 l
    2. tasks信息与cpu: 开关 t
    3. memory信息:开关 m
    4. cpu分别显示:(数字)1,将cpu核心分别显示处理
  • 排序:
    p:以占据的cpu百分比%cpu
    M:占据内存百分比,%MEM
    T:累计占据CPU时长,TIME+

  • 管理指令:
    q:退出命令
    S:修改刷新时间间隔
    k:终止指定进程
    W: 保存至root/.toprc

7.5.1 htop命令:EPEL源

与top命令相似,UI设计前卫一些
- 格式
htop [选项]
- 选项:
-d#:指定延迟时间
-u UserName:仅显示指定用户的进程
-s COLUME:以指定字段进行排序
- 子命令
s:跟踪选定进程系统调用
l:显示选定进程打开的文件列表
a:将选定的进程绑定至某指定CPU核心
t:显示进程树

7.6 内存空间

7.6.1 命令free

内存空间使用状态

  • 格式:free[OPTION]
  • 选项
    -b:以字节为单位
    -m:以MB为单位
    -g:以GB为单位
    -h:易读模式

    buffers,解决速度不匹配问题;cache缓存,提高访问速度的
    

    -t:显示RAM+swap的总和
    -s n:刷新间隔为n秒
    -c n:刷新n次后即退出

  • 执行结果

$free
                total       used       free     shared    buffers     cached                                                 
1Mem:       1003020     887824     115196       4104      89252     428612
2:-/+ buffers/cache:     369960     633060      
3Swap:      2097148       1076    2096072
  1. 内存使用情况
  2. -/+ buffers/cach
    (-buffers/cache) used内存数: used – buffers – cached
    (+buffers/cache) free内存数 :free + buffers + cached
  3. 虚拟内存信息

7.6.2 vmstat命令

虚拟内存信息

  • 格式:vmstat [options][delay[count]]
  • 选项:
    -s:显示内存的统计数据
  • 示例:
    vmstat 1 动态观察,1秒刷新一次
    vmstat 1 10 执行10次退出,1秒执行一次

  • 执行结果说明

vmstat -n
|procs| |-----------memory--------| |-swap-| -|---io---|-|system ||-------cpu-----|
    1                 2                 3          4        5              6
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs  us sy id wa st
 0  0      0 107296  94720 442468    0    0     5     1   17   16  0  0 100  0  0   
  1. procs:
    r:可运行(正运行或等待运行)进程的个数,和核心数有关
    b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
  2. memory:
    swpd:交换内存的使用总量
    free: 空闲物理内存总量
    buffer:用于buffer的内存总量
    cache:用于cache的内存容量
  3. swap
    si:从磁盘交换进内存的数据速率(kb/s)
    so:从内存交换至磁盘的数据速率(kb/s)
  4. io:
    bi:从块设备读入数据到系统的速率(kb/s)
    bo:保存数据至块设备的速率
  5. system:
    in:interrupts终端速率,包括时钟
    cs:context switch 进程切换速率
  6. cpu:
    us:运行非内核代码的时间
    sy:运行内核代码的时间
    id:空闲时间.Linux2.5.41前,包括IO-wait time
    wa:I/O等待时间. 2.5.41前,包括in idle
    st:丢失时间. 2.6.11前,unknown

7.6.2.1 命令iostat

与vmstat使用方法相似,统计CPU和设备IO信息

  • 格式:iostat [选项] [-p [device…] [interval [count] ]
  • 选项:
    -c:仅显示CPU统计信息.与-d选项互斥.
    -d:仅显示磁盘统计信息.与-c选项互斥.
    -k:以K为单位显示每秒的磁盘请求数,默认单位块.
    -p:device | ALL 与-x选项互斥,用于显示块设备及系统分区的统计信息.
    -t:在输出数据时,打印搜集数据的时间.
    -V:打印版本号和帮助信息.
    -x :输出扩展信息.
  • 示例

1、监控设备adv1的扩展数据,每秒刷新一次,执行10次

iostat -x -d sda1 1 10
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda1              0.00     0.00    0.01    0.00     0.09     0.00     8.42     0.00    0.07    0.07    0.14   0.07   0.00

rrqm/s:每秒这个设备相关的读取请求有多少被合并了
rsec/s:每秒读取的扇区数
avgrq-sz:平均请求扇区的大小
avgqu-sz:是平均请求队列的长度,越短越好
await:  I/O响应时间,一般低于5ms,await与svctm差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm: 表示平均每次设备I/O操作的服务时间   
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度

2、以k为单位显示磁盘使用情况,每2秒刷新一次

iostat -d -k 2
  • 执行结果示例
iostat
1:Linux 2.6.32-754.el6.x86_64 (hai6)    09/06/2018  _x86_64_    (4 CPU)

2:avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.16    0.00    0.00   99.81

3:Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
   scd0              0.01         0.03         0.00       1540          0
   sda               0.46        19.71         2.57    1047842     136528

  1. 架构CPU信息
  2. CPU信息
  3. 块设备信息
    1. tps: 每秒钟发送到的I/O请求数.
    2. Blk_read /s: 每秒读取的block数.
    3. Blk_wrtn/s: 每秒写入的block数.
    4. Blk_read: 读入的block总数.
    5. Blk_wrtn: 写入的block总数.

7.6.3 命令pmap

进程对应的内存映射,与文件/proc/PID(进程编号)/maps类似
- 格式
pmap [options] pid […]
- 选项
-x:显示详细格式的信息

  • 执行示例
pmap -x 7795
7795:   nano
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000     168     112       0 r-x--  nano
0000000000629000       8       8       4 rw---  nano
0000000001fd9000     528     468     468 rw---    [ anon ]
...               <==省略

cat  /proc/7795/maps  <==与pmap显示内容相似
  1. RSS:真正占用空间
  2. Dirty:脏数据,数据没有最终结束,处于中间状态

8. 系统监控工具

8.1 命令glances

EPEL源,可以跨网络监控

  • 格式
    glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file][-o output]

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

  • 内建命令
    a :按进程自动排序
    l :显示或隐藏日志
    c :按 CPU% 排序
    b :Bytes or bits for network I/O
    m :按 MEM% 排序
    w :删除警告日志
    p :按用户排序
    x :删除警告和关键日志
    i :按I/O使用状况排序
    1 :轮流显示每个CPU内核的使用情况
    d :显示隐藏磁盘读写状况
    h :帮助信息
    f :显示系统信息
    t :View network I/O as combination
    n :显示网络状态
    u :View cumulative network I/O
    s :显示传感器信息
    q :离开程序
    y : hddtemp统计信息

  • C/S模式下运行glances命令,跨网络访问

    1. 服务器模式:
      glances -s -B IPADDR
      -s :表示以服务器端
      -B:开启某一个监听地址,不加是所有网卡都参与
      IPADDR:指明监听的本机那个地址
    2. 客户端模式:
      glances -c IPADDR
      -c 以客户端
      IPADDR:要连入的服务器端地址,服务器指定的地址

8.2 命令dstat

系统资源统计,代替vmstat,iostat
- 格式
dstat [-afv] [options..] [delay[count]]

  • 选项
    -c:显示cpu相关信息
    -C: 当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息
    -d :显示disk相关信息
    -D: total,sda,sdb…
    -g:显示page相关统计数据
    -m:显示memory相关统计数据
    -n:显示network相关统计数据
    -p:显示process相关统计数据
    -r:显示io请求相关统计数据
    -s:显示swapped相关统计数据
    -y:系统状态
    - -socket:用来显示tcp udp端口状态
    - -ipc:显示ipc消息队列,信号等信息
    - -top-cpu:显示最占用CPU的进程
    - -top-io:显示最占用io的进程
    - -top-mem:显示最占用内存的进程
    - -top-latency:显示延迟最大的进程
    - -output :将状态信息以##.csv后缀定向到指定目录下。

  • 示例
    在命令行输入dstat 2 10,默认选项为-cdngy

dstat   2   10 
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw

systemint、csw分别为系统的中断次数(interrupt)和上下文切换(context switch)

8.3 命令iotop

是一个用来监视磁盘I/O使用状况的top类工具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息,可查看每个进程是如何使用IO
iotop输出
第一行:Read和Write速率总计
第二行:实际的Read和Write速率
第三行:参数如下:
线程ID
优先级
用户
磁盘读速率
swap交换百分比
IO等待所占的百分比
线程/进程命令

iotop常用参数
-o,–only只显示正在成I/O的进程或线程,除了传参,可以在运行过程总按o生效
-b,–batch非交互模式,一般用来记录日志
-n NUM,–iter=NUM设置监测的次数,默认无限。在非交互模式下很有用
-d SEC,–delay=SEC设置每次检测的间隔,默认1秒,接受非整型数据例如1.1
-p PID,–pid=PID指定检测的进程/线程
-u USER,–user=USER指定监测某个用户产生的I/O
-P –processes仅显示进程,默认iotop显示所有线程
-a,–accumulated显示累计的I/O,而不是带宽
-k,–kilobytes使用KB单位,而不是对人友好的单位,在非交互模式下,脚本编程有用
-t,–time加上时间戳,非交互非模式
-q,–quiet禁止头几行,非交互模式,有三种指定方式
-q 只在第一次监测时显示列名
-qq永远不显示列名
-qqq永远不显示I/O汇总
交互按键
left和right方向键:改变排序
r:反向排序
o:切换至选项–only
p:切换至–processes选项
a:切换至–accumulatd选项
q:退出
i:改变线程的优先级

8.5 命令lsof

list open files查看当前系统文件的工具,在Linux环境下,一切皆文件,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件如传输控制协议(TCP)和用户数据协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符

  • 格式
    lsof [选项]

  • 选项
    -a:列出打开文件存在的进程
    -c :显示command列中包含指定字符的进程所打开的文件
    -g:列出GID号进程详情
    -d FD:列出占用该文件号的进程
    +d /DIR/:列出目录下被打开的文件
    +D /DIR/:递归列出目录下被打开的文件
    -n目录:列出使用NFS的文件
    -i条件:列出符合条件的进程(4、6、协议、:端口、@ip)
    -p进程号:列出指定进程号所打开的文件
    -u:列出UID号进程详情
    -h:列出UID号进程详情
    -v:显示版本信息
    -n:不反向解析网络名字

  • 示例

    1. 查看由登录用户启动而非系统启动的进程

      $tty
      /dev/pts/0
      $lsof /dev/pts/0
      COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
      bash    2189 root    0u   CHR  136,0      0t0    3 /dev/pts/0
      bash    2189 root    1u   CHR  136,0      0t0    3 /dev/pts/0
      bash    2189 root    2u   CHR  136,0      0t0    3 /dev/pts/0
      
    2. 指定进程号,可以查看该进程打开的文件

      $lsof -p 2189
      COMMAND  PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
      bash    2189 root  cwd    DIR    8,3      4096        64 /data
      bash    2189 root  mem    REG    8,2 106070960 101092451 /usr/lib/locale/locale-archive
      ...                              <==省略部分内容
      bash    2189 root   0u    CHR  136,0       0t0         3 /dev/pts/0   
      
    3. 通过参数-i查看网络连接的情况,包括连接的ip、端口等以及一些服务的连接情况,例如:sshd等,也可以通过制定ip查看该ip的网络连接情况
      lsof -i -n
      lsof [email protected]

    4. 通过参数-i:端口,可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
      lsof -i:80 -n

    5. 查看指定状态的网络连接
      lsof -n -P -i TCP -s TCP:ESTABLISHED
      -n:no host names, -p:no port names, -i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等

  • 恢复删除文件,此方法只适用于正在使用的文件

    1. 确定文件是在使用中
      lsof /var/log/messages
    2. 删除文件
      rm -f /var/log/messages
    3. 查看文件进程,拿到进程编号
      lsof |grep /var/log/messages
    4. 进入对应进程下的fd文件
      cd /proc/1027/fd/
    5. 查看文件列表,可以看到带有(deleted)的文件
      $ll
      lrwx------ 1 root root 64 Sep 6 14:15 3 -> socket:[28141]
      l-wx------ 1 root root 64 Sep 6 14:15 4 -> /var/log/messages (deleted)
    6. 恢复文件
      $cat /proc/1027/fd/4>/var/log/messages
      $ls /var/log/messages
      /var/log/messages <==已恢复
  • 执行结果说明
$lsof -i tcp
COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rpcbind    744     rpc    8u  IPv4  15285      0t0  TCP *:sunrpc (LISTEN)
rpcbind    744     rpc   11u  IPv6  15288      0t0  TCP *:sunrpc (LISTEN
  1. COMMAND:进程的名称
  2. PID:进程标识符
  3. USER:进程所有者
  4. FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
  5. TYPE:文件类型,如DIR、REG等
  6. DEVICE:指定磁盘的名称
  7. SIZE:文件的大小
  8. NODE:索引节点(文件在磁盘上的标识)
  9. NAME:打开文件的确切名称

9 命令kill、pkill

9.1 kill

用来删除执行中的程序或工作,kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看
- 格式
kill [选项] [参数]

  • 选项
    -l :列出指定编号的信息,不指定则列出全部的信息名称
    -n:指定信号,编号或名称都可以
    -u:指定用户

  • 信号

    1. 介绍
      向进程发送控制信号,以实现对进程管理,每个信号对应一个数字,信号名称以SIG开头,不区分大小写
    2. 查看
      显示当前系统可用信号:kill -l, trap -l
      常用信号:man 7 signal
    3. 指定信号的方法
      (1)信号的数字标识:1、2、9
      (2)信号完整名称:SIGHUP
      (3)信号的简写名称:HUP
    4. 常用信号
编号 名称 作用
1 SIGHUP 无须关闭进程而让其重读配置文件
2 SIGINT 终止正在运行的进程;相当于Ctrl+c|
3 SIGQUIT 相当于ctrl+|
9 SIGKILL 强制杀死正在运行的进程
15 SIGTERM 终止正在运行的进程
18 SIGCONT 继续运行
19 SIGSTOP 后台休眠
  • 示例

    1. 终止程序nano

      1: $ps -C nano            <==找到对应PID
        PID TTY          TIME CMD
        4763 pts/0    00:00:00 nano
       2:$kill -n 15 4812      <==终止进程
      
    2. 强制终止httpd服务

      $echo $$      <==查看当前bash进程
      2189
      $kill 2189       <==尝试终止进程,没有终止
      $kill    -9   2189        <==使用9信号,强制终止
      
    3. 终止全部同名进程

      $pidof httpd              <==httpd有很多进程,也可以直接终止父进程
      9919 9918 9917 9916 9915 9914 9913 9912 9909
      $killall -15 httpd        <==这里主要为说明killall用法
      

9.2 命令pkill

与pgrep用法相似,查找同时可以终止进程

  1. 格式:pkill [options] pattern
  2. 选项
    -signal:发送信号给匹配到的进程
    -u uid:effective user,生效者
    -U uid:real user ,真正发起运行命令者
    -t terminal:与指定终端相关的进程
    -l:显示进程名(pgrep可用)
    -a:显示完整格式的进程名(pgrep可用)
    -P pid:显示指定进程的子进程
  3. 示例
    1. 删除所有以http开头的进程
      pkill -9 "^http"
    2. 删除终端1的进程
      $pkill -t pts/1 <==结束部分运行进程
      $pkill -t pts/1 -9 <==连同终端一起关闭

猜你喜欢

转载自blog.csdn.net/free050463/article/details/82390928