zoukankan      html  css  js  c++  java
  • 进程管理

    概述

    进程是应用程序的一个运行实例,即运行种的程序为进程
    进程以进程发起者的身份运行
    任何时候,用户操作计算机,就是在发起进程,因此进程是用户操作计算机的代理

    进程分类:

         跟终端相关的进程:从终端启动的进程

         跟终端无关的进程:随系统一起启动的进程

    查看进程

    ps命令

    ps命令参数格式:

      1.Unix风格:参数前加破折号 

          -e      显示所有进程

          -f       显示完整格式

          -l        长格式

         -o      指定输出字段,如:ps -o pid,comm,ni 

          -H      层级化显示(树状显示:父子进程相邻),可清楚看出进程启动顺序。

      2.BSD风格:参数前不加破则号

          #ps aux

               a:所有跟终端有关的进程

               u:显示进程的发起用户

               x:显示所有跟终端无关的进程

    #ps  -elf

    F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
    4 S root 1 0 0 80 0 - 4838 poll_s Jul01 ? 00:00:00 /sbin/init

    字段解释:

    F   内核分配给进程的系统标记

    S   进程的状态

          0  睡眠

          S  休眠

          R  可运行,正等待运行

          T  停止

           Z  僵死(运行结束的进程不释放内存)

    UID  进程属主

    PID  进程ID

    PPID 进程的父进程ID

    C     进程声明周期中的CPU利用率

    PRI   进程优先级(数值越大优先级越低)

    NI   谦让度,用来参与决定优先级

    ADDR  进程的内存地址

    SZ 进程换出需要的交换空间

    WCHAN  进程休眠的内存函数的地址

    STIME  进程启动时的系统时间 

    TTY    进程启动时的终端设备,非终端设备启动的进程显示?号

    TIME  运行进程需要的累计CPU时间

    CMD  进程名

          [进程名]:进程名外加[],表示该进程为内核线程

    pstree  查看进程树

    pidof 查看进程ID

    pidof 进程名   

    top  实时查看进程

    top [option]

        -d:刷新时长

    #top

    top - 04:25:41 up 18:03, 2 users, load average: 0.00, 0.00, 0.00
    Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
    Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
    Mem: 502360k total, 378996k used, 123364k free, 46496k buffers
    Swap: 1015800k total, 0k used, 1015800k free, 199956k cached

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    1 root 20 0 19352 1560 1260 S 0.0 0.3 0:00.59 init

    显示内容解释:

    1.第1行

        系统当前时间、运行时间、登陆用户树

        up:系统运行时长

        load average:最近1min,5min,15min分钟的平均负载

    2.第2行

       Tashks:任务数

    3.第3行

       us:用户相关进程占用CPU百分比

       sy:系统相关进程占用CPU百分比

       ni:调整谦让度,影响CPU的比例

       id:CPU空闲百分比

       wa:等待I/O完成所占用的时间

       hi:硬件中断所占用的时间

       si:软中断所占用的时间

       st:被偷走的时间(虚拟化)

    4.第4行、第5行:系统内存使用情况

    5.第6行:

      VIRT:进程占用的虚拟内存总量

      RES:进程占用的物理内存总量

      %CPU:进程使用CPU的比例

      %MEM:进程使用的比例

     %TIME+:进程自启动到当前,使用CPU的时间总量

    交互命令:

    M 根据占用内存大小排序

    P 根据CPU使用百分比排序

    T 根据累计使用CPU时间排序

    z 切换彩色模式还是单色模式

    u 显示某个用户的进程

    q 退出top

    k 终止某个进程

    备注:默认情况,top命令按CPU利用率排序

    结束进程 

    kill -l   #查看所有可执行的信号

    kill PID     #向进程发送SIGTERM信号,终止进程(如果程序跑飞,将不能响应此信号)

    kill -9 PID   #向进程发送SIGKILL,无条件终止进程

    killall 进程名   #支持通配符

    处理信号

    进程之间通过信号来通信,常用linux进程信号如下:

    信号    名称         描述

    1        SIGHUP    挂起进程

    2        SIGINT     终止进程

    9       SIGKILL    无条件终止进程

    15    SIGTERM  可能的话终止进程

    18    SIGTSTP   暂停进程,不终止进程(下次启动时,可从上次执行的位置继续往下运行)

    19    SIGCONT  继续运行停止的进程

     产生信号

    ctrl+C:产生SIGINT信号,终止当前进程

    ctrl+Z:产生SIGTSTP信号,暂停当前进程

    #sleep 100

    ^Z      #键入Ctrl+Z命令

    [1]+ Stopped   sleep 100    #1表示作页号

     捕捉信号

    shell脚本默认忽略信号,将信号交给上层处理,可以使用trap命令捕捉信号,在本地处理。

    trap commands signals

     捕捉普通信号

    示例:检测到SIGINT或SIGTERM信号时不终止进程,而是打印一行信息

    #cat trapsig.sh
    #!/bin/bash
    trap "echo 'Sorry I have traped Ctrl-C" SIGINT SIGTERM
    echo "This is a test program"
    sleep 100
    #./trapsig.sh
    This is a test program
    ^C    #输出Ctrl+C命令,产生一个SIGINT信号,结果打印如下,而不是终止进程
    Sorry I have traped Ctrl-C
    

     捕捉脚本退出信号  trap  command EXIT

    示例:捕捉脚本退出(EXIT),打印byebye

    # cat test1
    #!/bin/bash
    trap "echo byebye" EXIT
    echo This is a test program
    count=1
    while [ $count -le 5 ]
    do
      echo "Loop #$count"
      sleep 2
      count=$[ $count + 1 ]
    done
    # ./test1
    This is a test program
    Loop #1
    Loop #2
    Loop #3
    Loop #4
    Loop #5
    byebye 
    

     移除捕捉 trap -

    cat test1
    #!/bin/bash
    trap "echo byebye" EXIT
    echo This is a test program
    count=1
    while [ $count -le 5 ]
    do
      echo "Loop #$count"
      sleep 2
      count=$[ $count + 1 ]
    done
    trap - EXIT
    echo "I just removed the trap"
    # ./test1
    This is a test program
    Loop #1
    Loop #2
    Loop #3
    Loop #4
    Loop #5
    I just removed the trap

    后台模式运行脚本

    &

    后台运行不影响前台操作,但仍然会使用显示器来显示STDOUT和STDERR信息

    #[root@localhost home]#unt=1
    while [ $count -le 5 ]
    do
        sleep 2
        echo "Loop: $count"
        count=$[ $count + 1 ]
    done
    [root@localhost home]#./test.sh & [1] 5463 #1表示作业号,5463表示进程号

      [root@localhost home]# Loop: 1
    Loop: 2
    Loop: 3
    Loop: 4
    Loop: 5

    [1]+ Done ./test.sh   #Done表示执行完成

    非控制台方式运行脚本 nohup

    默认情况下,每个后台终端进程都绑定了在绑定在某个终端中,如:pts/0,如果终端被关闭了,则后台进程也会退出

    nohup命令会阻止所有发给该进程的SIGHUP信号,保证终端退出,后台进程不结束

    nohup会把脚本输出结果,追加至当前目录下nohup.out文件中

    1.运行上例的脚本

    #nohup ./test1.sh &

    2,退出并重登终端,待脚本运行结束后,查看nohup.out文件

    #cat nohup.out

    Loop: 1
    Loop: 2
    Loop: 3
    Loop: 4
    Loop: 5

     作业控制

    linux将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号

    1.查看作业

    jobs 

      -l  列出进程ID及作业号

     -p  只列出作业的pid

     -r  只列出运行中的作业

     -s 只列出已停止的作业

     -n 只列出上次shell发出的通知后改变了状态的作业

    #cat test.sh

    sleep 100

    #./test.sh

    ^Z    #ctrl+Z命令

    [1]+  Stopped                 ./test.sh

    #./test.sh

    ^Z  #ctrl+z命令

    [2]+  Stopped                 ./test.sh

    #./test.sh &

    [3] 15631

    #jobs -l

    [1]- 15627 Stopped ./test.sh
    [2]+ 15629 Stopped ./test.sh
    [3] 15631  Running ./test.sh &

    字段解释:

    作业号

    + 表示默认作业,使用控制命令时,不指定作业号,默认操作此作业

    - 当前默认作业完成时,带-号的作业会成为下一个默认作业

    进程号:

    作业状态:

          Stopped   #暂停的作业

          Running   #运行中

          Done   #作业变成Done,下次jobs查看将不存在

    进程名:

    2.重启作业

    重启暂停的作业,从上次暂停的位置继续运行。

    #bg [作业号]   #后台方式重启作业

    #fg  [作业号]   #前台方式重启作业

    2.终止作业

    kill %作业号

    调整谦让度

     同一时间,只有一个进程可以使用CPU,内核通过将CPU时间轮流分配给每个进程,实现多进程同时运行。

    调度优先级是内核分配给进程的CPU时间总量,默认每个进程的调度优先级都相同,等于0

    设置范围:-20~20,越小表示优先级越高,可使用CPU时间越多。

    #nice -n -10 ./test1.sh   #调整调度优先级=-10

    #renice -n 5 -p 6030  #修改进程号6030的调度优先级为5

    备注:

        普通用户只能使用renice调整自己的进程的优先级,并且自能降低优先级

        root用户可以调整进程优先级到任何值

    定时运行作业 at   

    一次性

    at命令会将作业提交到队列,指定shell何时运行该作业

    at的守护进程atq会以后台模式运行,默认每60s检查/var/spool/at目录来获取提交的作业

    at [-f filename]  time

       -q     #指定作业队列优先级,a的优先级最高

    time:  

      at now +5 minutes  #5分钟后执行

      at now +5 hour    #5小时后

      at now +5 days  #5天后

      at now +5 weeks #5周后

      at 10:31am  #上午10:31
      at 10:31pm  #下午10:31
      at  10:31  2017-01-01  #2017-01-01 10:31

    示例: 

    #at  +5 minutes

    >pwd

    >  Ctrl+D    #ctrl+D结束命令输入

    job 7 at 2017-07-02 08:46
    # atq   #查看at任务
    7 2017-07-02 08:46 a root

    查看作业执行结果:/var/spool/mail邮箱

    删除任务

    #atrm 任务号

    周期性任务 cron

    前提:安装vixie-crom和crontabs软件包

    服务名:crond

    #crontab -e     #编辑任务

    任务格式: 分 时 日 月 周 命令 

    15 10 * * 6  pwd     #每周六的10:15分,执行pwd命令

    15 10 * * * if [`date +%d -d tomorror` = 01 ]; then; /root/test.sh > stdout.file    #每月最后1天执行此脚本

    15 10 * * 1~5  date  #周一至周五10:15分运行date命令

    #crontab  -l   #查看任务

    #cromtab -r  #删除所有任务

    作业执行结果:在用户邮箱中,/var/spool/mail

    周期性运行目录:

    /etc/crom.hourly:此目录下的脚本,每小时运行一次

    /etc/cron.daily :此目录下的脚本,每天运行一次

    /etc/cron.weekly:此目录下的脚本,每周运行一次

    /etc/cron.monthly:此目录下的脚本,每月运行一次

    查看系统状态 vmstat

    vmstat 3 10   #每个3s,显示10次

    # vmstat
    procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
    r b swpd free buff cache si so bi bo in cs us sy id wa st
    0 0 0 12396 53788 283372 0 0 3 4 17 32 0 0 99 1 0

    解释:

    procs:进程相关

      r:运行队列长度

      b:阻塞队列长度

    memory:内存相关

      swpd:已使用的交换内存大小

       free:空闲内存

      buff:缓冲空间大小

      cache:缓存空间大小

    swap:交换分区相关

      si:多少页面从物理内存换出

      so:多少页面换入物理内存

    io:I/O相关

      bi:多少磁盘块被调入到物理内存

      bo:多少磁盘块从内存中同步到磁盘

    system:内核空间相关

      in:interrupt终端的个数

      cs:进程切换的次数

    cpu:CPU利用率

      us:用户进程占用的CPU利用率

      sy:系统进程占用的CPU利用率

      id:cpu空闲利用率

      wa:等待I/O完成所占用的时间

      st:被偷走的时间

    111
  • 相关阅读:
    时间随手记
    laravel简书(2)
    laravel简书(1)
    <<Design Patterns>> Gang of Four
    计算机网络你还懵逼吗?持续更新!!!
    poj3126 搜索
    POJ 1426 搜索进阶
    CodeForces 660D
    poj3279搜索详解
    bfs简单题-poj2251
  • 原文地址:https://www.cnblogs.com/zmdsg/p/7106099.html
Copyright © 2011-2022 走看看