马哥教育第十二天、进程管理、top、dstat、htop、case


  1. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

    cpu环0只运行内核,环3运行用户进程,当用户进程需要运行特权指令时(和硬件交互等)会发起软中断由用户模式转为内核模式,由内核代为执行相关操作。

    进程被内核调度分为不同进程状态:

            运行态(running):正在运行过程中的进程,

            睡眠态(sleeping):等待调度到cpu上运行之前的状态,分为可中断睡眠(interruptable):随时可以被唤醒,等待下一次被调度到cpu运行之前。不可中断睡眠(uninterruptable):等待外部满足之前无法继续运行状态。

            停止态(stopped):不会被内核调度并运行,只占用内存不占用cpu资源。

            僵死态(zombie):进程创建机制:每一个进程都是由其父进程fork()自身而来,创建一个与之相同的子进程,子进程被销毁后由父进程进行资源回收,当父进程被销毁于子进程前该子进程就称为僵尸进程。

    进程间通信:IPC (InterProcess Communication)

            同一主机通信:signal、shm共享内存、semerphor旗语

            不同主机通信:远程过程调用rpc: Remote Procedure Calling、socket

    CPU虚拟化:内核把cpu分为时间片(timeslice),进程没有运行结束但分配使用cpu时间结束,需要保存现场,等待内核下次调度该进程继续在上次结束位置运行称为恢复现场。

    线程:比进程更小可单独被调用执行的单位。在linux中被称为lwp轻量级进程

    进程分类:批处理进程,主要工作于后台对cpu占用率比较高、交互式进程对I/O设备占用率比较多、实时进程此类进程优先级最高必须优先处理。

    内存分页,每4k被内核分为一个页框(存储单位),内核负责从线性地址的页面数据映射到物理地址的页框中,内核借助于cpu硬件芯片mmu: 内存管理单元(memory management unit)存储线性地址和物理地址之间映射关系

    物理地址空间、线性地址空间是由内核虚拟给进程的,每个进程都认为自己可以使用全部内存,进程调度优先级140个(0-139)

            实时优先级:1-99数字越高优先级越高。

            静态优先级:100-139数字越小优先级越高,静态优先级用户可以根据nice值调整从-20--19对应100-139,进程启动nice默认为0,优先调度级高的进程,但是内核会根据进程被cpu使用频率自动提高或降低进程优先级,

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

  2. Linux进程管理工具:ps, pstree, pidof, top, htop, pmap, vmstat, dstat, kill, job, glance

    pstree:查看进程树。

    ps:显示进程状态的命令,常用选项a、x。a显示与终端相关的进程,x显示与终端无关的进程。支持两种风格:SysV, BSD在选项上无需加-例如:ps a 。相关字段解释:PID:进程号、TTY:终端信息、 STAT:进程状态、TIME:运行时长、COMMAND:那个程序启动的该进程

    常用组合ps aux或-ef或-eFH:-e显示所有进程,-f显示完整格式列表信息,-F:显示额外信息,-H:显示进程的层次结构

    ps aux字段解释:USER:用户、 PID:进程号、%CPU:cpu占用百分比、%MEM内存占用百分比、VSZ(Virtual memory SiZe):虚拟内存集,占用线性地址空间大小、RSS:常驻内存集(不能被内存页转移到swap空间的)、TTY:和终端相关、STAT:进程状态、START:进程启动时间、TIME:运行累计时长、COMMAND:表示那个程序启动的该进程,包含在[]的进程表示为内核线程

    ps -ef字段解释:UID:用户ID、PID:进程号、PPID:父进程号、C:cpu累计运行时长、STIME、TTY、TIME、CMD

    ps -eFH字段解释:UID、PID、PPID、C、SZ、RSS、PSR:显示进程运行在那颗cpu上、STIME、TTY、TIME、CMD

    ps -o自定义显示字段,常用组合ps axo例如:ps axo pid,command,psr,pri,ni,pri:进程优先级,ni:进程nice值

    STAT状态说明:

             R::运行态running

             S::可中断睡眠

             D:不可中断睡眠

             T:停止态stopped

             Z:僵死态zombie

             s::多个进程的领导者session leader

             +:前台进程

             l: 多线程进程

             N:低优先级进程

             <::高优先级进程

    pgrep:是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行

             -U UID:仅显示由指定用户启动的进程,例如:pgrep -U apache

             -G GID:仅显示与指定组相关的进程,例如:pgrep -U postgres

             -t term...: 仅显示与指定终端相关的进程,例如:pgrep -t tty1

             -l 同时显示进程号和程序名,例如:pgrep -lt tty1

    pidof:显示指定程序所启动的进程的ID,例如:pidof postgre

    top:显示linux任务,可以指定排序机制,M:内存百分比排序、P:CPU百分比排序、T:累积占用的CPU时间排序

             l:是否显示负载信息,显示格式如下:

                显示当前时间、系统运行时间、登录系统有多少用户、过去1,5,15分钟的平均负载指等待运行的进程队列的长度

             t:是否显示进程和cpu相关信息,进程显示格式如下:

                 当前系统的进程总数、多少进程处于运行态、进程处于睡眠态、处于停止态、处于僵死态

             显示cpu信息格式如下: Cpu(s)表示为多核cpu,默认显示平均值,按1分别显示多核cpu详细信息

                us: 用户空间运行进程占用cpu百分比、sy:用于运行内核占用cpu百分比、ni:调整nice值占用cpu百分比、id:空闲cpu百分比、wa:等待I/O设备完成占用cpu百分比、hi:处理硬中断占用cpu百分比、si:处理软中断占用cpu百分比、st:被虚拟机占用的cpu百分比

             m:显示内核和交换内存相关信息,

                 Mem:内存大小、used:已使用大小、free:未使用大小、buffers:缓冲大小、cached:缓存大小、swap:交换内存大小

             q:退出top、k终止某个进程、s修改top刷新频率,默认为3秒

             top字段说明:PID、USER、PR:RT表示实时优先级、NI:nice值、VIRT:虚拟内存集、RES:常驻内存集、SHR共享内存大小、S:进程状态、%CPU、%MEM、TIME+:累计占用cpu时间、COMMAND:启动此进程的命令

    htop:是一个 Linux 下的交互式的进程浏览器,可以用来替换Linux下的top命令

             u:交互式选择显示用户相关进程。

             l:光标选中进程,l显示该进程文件列表,esc退出。

             s:光标选中进程 ,s显示进程执行的系统调用,esc退出。

             a:指定进程调度在那个cpu上

             F1:获取帮助

    vmstat:命令报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息例如:vmstat 2 3 ,每2秒更新一次只显示3次

             procs:字段说明:

                      r:运行队列的长度、如果该队列过长说明cpu运行太慢。

                      p:被阻塞(等待IO完成,如:不可中断睡眠)队列的长度,如果该队列太长说明I/O设备读写速度太慢

             memory:内存字段说明:

                     swpd:从物理内存交换至swap中的数据量

                     free:空闲物理内存大小

                     buff:缓冲、为了提高加速写操作

                     cache:缓存、为了提高加速读操作

             swap:交换分区字段说明:

                     si(swap in):数据进入swap中的数据速率,kb/s

                     so(swap out):数据离开swap中的数据速率,如果频繁的读写交换分区说明内存太小,需要添加

             io:

                     bi(block in): 从块设备读入的数据速率,kb/s

                     bo(block out):保存至块设备的数据速率

             system:

                      in(interrupt): 中断速率

                      cs(context switch):进程切换速率

              cpu:us:、sy:、id:、wa:、st:

    常用选项:-s:显示内存统计数据 

  3. 进程启动时调整nice值例如:nice -n 5 top

    调整已运行进程的nice值,例如:renice -n -5 pid

    进程间通信,信号:signal,借助于kill命令基于kill命令向其它的进程发信号,显示常用信号:kill -l或man 7 nignal,每个信号都可以使用三种方式之一在Kill进行调用:

    数字代称:1, 2, 9, 15

    信号完整名称:SIGHUP, SIGINT, SIGKILL, SIGTERM

    信号简称:HUP, INT, KILL, TERM

            1) SIGHUP:让程序重读配置文件需无须重新启动;

            2) SIGINT:interrupt,打断正在运行中的程序;

            9) SIGKILL:直接结束进程

            15) SIGTERM:允许该进程完成任务后结束,默认发该信号例如:kill PID

    killall:结束某一类所有进程例如:killall -9 httpd

    Linux作业控制:

    前台作业:通过终端启动,并在终止之前一直占据着终端

    后台作业:作业启动之后即运行于后台,释放前台

    交互式模式:手动启动的非守护进程类的程序,一般都运行于前台;

    如何将作业运行于后台:

            1、运行中的作业:Ctrl+z,送往后台后,作业处于STOPPED状态

            2、尚未启动作业:COMMAND &,此类操作终端关闭该进程也终止,nohup COMMAND &终端关闭进程也正常允许

    查看Ctrl+z送往后台的作业:jobs,

    作业控制命令:fg #:将后台作业调回前台,bg #:让后台作业继续在后台运行

    dstat:进程查看

            -c: 显示CPU统计数据

            -d: 显示disk统计数据

            -D DISK: 只显示指定disk的统计数据

            -g: 显示page的统计数据

            -i: 显示中断的统计数据

            -m: 显示内存的统计数据

            -l: 显示系统负载的统计数据

            -n: 显示网络接口相关

            -N INTERFACE: 仅显示指定的网络接口的数据

            -s: 显示交换内存

            -p: 进程队列

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

            -y: 系统状态数据

            -f:以完整格式显示所有信息

            -v":显示结果类似于vmstat命令

    默认相当于使用“dstat -cdngy”,也相当于“dstat -a”

    网络连接状态统计:--tcp、--udp、--raw、--unix

    pmap命令:显示指定进程的物理内存空间映射表。例如:pmap PID

    glances类似于htop,但是可以查看远程主机信息:由epel源所提供

    课外作业:nmap, netcat, tcpdump, nethogs, iftop

  4. case有多个测试条件时,case语句会使得语法结构更清晰,支持文件名通配机制,还支持 | ,语法格式如下

    case 变量引用 in

    PATTERN1)

          分支1

          ;;

    PATTERN2)

         分支2

          ;;

    *

          分支n

          ;;

    esac

    练习:写一个脚本,对/etc/目录及内部的所有文件打包压缩

    显示一个菜单,让用选择使用的压缩工具:xz) xz compress tool、gz) gzip compress tool、bz2) bzip2 compress tool

    根据用户选择的工具,对/etc执行相应的操作并保存至/backups目录,文件形如/backups/etc-日期时间.tar.压缩后缀

  5. #!/bin/bash
    #
    read -p "Please select the compression method(xz | gz | bz2):" Compression
    etc="etc-`date +%Y-%m-%d-%H-%M-%S`"
    case $Compression in
    xz)
       tar Jcf "$etc.tar.xz" /etc/*
           if [ ! -d /backups ];then
                mkdir -p /backups
           fi
    
                mv "$etc.tar.xz" /backups/
           ;;
    gz)
       tar zcf "$etc.tar.gz" /etc/*
           if [ ! -d /backups ];then
                mkdir -p /backups
           fi
                mv "$etc.tar.gz" /backups/
           ;;
    bz2)
       tar jcf "$etc.tar.bz2" /etc/*
           if [ ! -d /backups ];then
                mkdir -p /backups
           fi
                mv "$etc.tar.bz2" /backups/
           ;;
    *)
       echo "you inpot error:"
    exit 5
    ;;
    esac

    练习:写一个脚本,使用形式如下所示showifinfo.sh [-i INTERFACE|-a] [-v]

    1、-i或-a不可同时使用,-i用于指定特定网卡接口,-a用于指定所有接口;显示接口的ip地址

    2、使用-v,则表示显示详细信息显示接口的ip地址、子网掩码、广播地址;

    3、默认表示仅使用-a选项;

  6. if [ $# -lt 1 ];then
            che=a
    else
            che=$1
    fi
    #read -p "please inpot i or a or v:" che
    count=`ifconfig | grep "eth[0-9]" | wc -l`
    if [  $che == "ia" -o $che == "ai" ]; then
        echo "Options a and i Cannot be used together "
        exit 6
    else
            case $che in
            i)
              read -p "please inpot need display network equipment this machine $count network:" str
               if [ $str -le $count &> /dev/null -a $str -gt 0 ];then
                   let str=$str-1
                  ipadd=$(ifconfig eth"$str" |grep -Eo "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>")
                  echo "eth$str addr:$ipadd "
               else
                   echo "you inpot error"
                   exit 2
               fi
            ;;
            a)
              for((i=0;$i < $count;i++));do
                ipadd=$(ifconfig eth"$i" |grep -Eo "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>")
                  echo "eth$i addr:$ipadd " 
              done
            ;;
            v)
              for((i=0;$i < $count;i++));do
                ipadd=$(ifconfig eth"$i" |grep -Eo "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9])\.){3}([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>")
                  echo "eth$i addr:$ipadd "
                ipadd=$(ifconfig eth"$i" |grep -Eo "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9])\.){3}(255)\>")
                  echo "eth$i Bcast:$ipadd "  
                ipadd=$(ifconfig eth"$i" |grep -Eo "\<(255\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9])\>")
                  echo "eth$i Mask:$ipadd "
              done
            ;;
            *)
            echo "error"
            exit 5
            ;;
            esac
    fi


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。