linux 进程管理

一、简述


    进程是加载到内存中的指令集,进程有进程ID加以标示。在Linux内核中,进程是由task_struct结构表示和管理的。每执行一个程序都会调用父进程init的fork系统调用创建一个子进程。


1,进程分类:


    (1)不同模式运行      

        内核模式 (ring0)

        用户模式 (ring 3)

        

        进程有时会访问外部的硬件资源或者特权资源,此时就会产生系统调用(system call)

    转入内核模式来完成,完成后返回到用户模式

    

    (2) 以占用资源的多少

        CPU-Bound: CPU密集型,这种进程更多的消耗CPU,对I/O占用量不是太大

        I/O-Bound: I/O密集型,这种进程占用I/O很多,对CPU消耗不大


    (3) 进程处理方式

        批处理进程:主要工作于后台,比较占用CPU

        交互式进程: 占用I/O比较多

        实时进程: 内核进程或内核线程,通常优先非常高,需要被立即执行或分配


2, 进程优先级

    (1) 实时优先级 :0 至 99,数字越大,优先级越高

    (2) 静态优先级 :100 至 139, 数字越小,优先级越高

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

    (3) 动态优先级:由内核动态维护,动态调整


3,进程状态

    动行态:runing

    睡眠态:sleeping

        可中断睡眠:interruptable

        不中断睡眠:uninterruptable

    停止态:stopped ,不会再被内核调度并运行

    僵死态:zombie


4,进程间通信:IPC ( InterProcess Communication )

     同一主机:

        signal : 信号

        shm : 共享内存

        semerphor : 旗语

     不同主机:

        RPC : Remot Procedure Calling (远程过程调用)

        socket : 套接字 (IP :port)


5,线程 

    比进程更小的可以被单独调度的单位

    thread : 轻量级进程 (LWP, light weight process) 


二、Linux进程管理工具

    

    1,pstree命令 查看进程数


  

    技术分享


    2,ps命令 :显示进程状态的命令,快照式一次性



    支持两种风格: Sysv, BSD


    常用选项:

        a: 与终端相关的进程

        x: 与终端无关的进程

        u: 显示动行进程的用户


     常用组合(1): ps aux

           注意:不要加 -

      技术分享

  

# 说明上图中各个字段的含义

# USER     运行此进程的用户名 
 
# PID      该process的号码

# %CPU     进程运行时所占的cpu百分比
  
# %MEM     该process所占用的物理内存百分比 
 
# VSZ      显示占用的线性地址空间的大小(包含其它共享的共享库所占据的空间)

# RSS      常驻内存集,不可以被交换出去的空间

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

# STAT     该进程目前的状态

# START    该 process 被触发启动的时间;

# TIME     该 process 实际使用 CPU 运作的时间。

# COMMAND  包含在中括号中的进程表示为内核进程

 

    STAT常用的状态有: 
   
        R (正在运行或在运行队列中等待) 

        S 该程序目前正在睡眠当中 ,但可被某些讯号 (signal) 唤醒。

        T 该程序目前暂停了

        Z 该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态

        D 不可中断状态. 

        < 高优先级的  

        N  低优先级的

        s  包含子进程

        l  多线程

        +  前台程序

    

    常用组合(2): ps -ef

            -e : 显示所有进程

            -f : 显示完整格式的信息


    技术分享

    # PPID  父进程的PID

    

    常用组合(3) : ps -eFH

        -F : 显示额外信息

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

        PSR: 表示进程运行在哪颗CPU上

    

    技术分享


    自定义要显示的信息 : -o     

# ps axo pid,ppid,ni,pri,cmd

    技术分享


    3,pgrep 按预定义模式查找进程


        -U UID :  仅显示由指定用户启动的进程

        -G GID :  仅显示与指定组相关的进程

        -t term... : 仅显示与指定终端相关的进程

        -l :同时显示进程号和程序名

        

    例如:

        # pgrep -U root -G root -l 

            搜索全部属于root用户也要属于root组的进程,打印进PID和程序名

        技术分享



    4,pidof 按确切的进程名查找     

        # pidof httpd
        1954 1953 1952 1951 1950 1949 1948 1947 1944

    

    5,top  动态查看进程


     # top

       技术分享

    

        快捷键:

        l : 显示或不显示负载信息 (同uptime命令)

            02:08:17 up  8:20,  2 users,  load average: 0.00, 0.00, 0.00

            

            2:08:17  : 当前时间
            
            up 8 min : 系统运行时间,格式为时:分
            
            2 users  : 当前登录用户数
           
            load average: 0.00, 0.00, 0.00  系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。


       t : 显示或不显示进程及CPU相关的信息 

            Tasks: 107 total,   1 running, 106 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
            Tasks: 107 total         进程总数
            
            running                  正在运行的进程数
            
            sleeping                 睡眠的进程数
            
            stopped                  停止的进程数
            
            zombie                   僵尸进程数
            Cpu(s): 0.0% us : 系统用户进程使用CPU百分比。  不包括调高优先级的进程。 CPU%是由每个核的CPU占用律之和算出来的。如果你是4核CPU,核1,CPU使用率为100%,核2,CPU使用率为100%。 则会出会CPU 高于100%的现象,最终为200%            
             
            sy : 内核中的进程占用CPU百分比
            
            ni : 用户进程空间内改变过优先级的进程占用CPU百分比
            
            id : 空闲CPU百分比
            
            wa:用于等待I/O所占的cpu百分比  
            
            hi:硬中断所占cpu百分比  
            
            si:软中断所占cpu百分比
            
            st:系统被“偷走”的cpu所占的百分比,一般指的是用于虚拟机运行所占的cpu


       1: 数字,分别显示各CPU的相关信息

            Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
            Cpu1  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st


       m : 显示不显示物理内存和交换分区的相庆信息 (同 free 命令)           

            Mem:   1012352k total,   419900k used,   592452k free,    47116k buffers            
            Swap:  1023992k total,        0k used,  1023992k free,   277116k cached
            Mem : 
                total         物理内存总量
                used          使用的物理内存总量
                free          空闲内存总量
            Swap :
                total         交换分区总大小
                used          使用的交换的大小
                free          未使用的交换的大小 
    
            buffers           缓冲 (加速写)
            cached            缓存(加速读)


        q :  退出


        k : 终止指定进程


        s : 修改刷新新时间间隔


        常用选项

            -d # : 指定刷新时间间隔
            
            -b : 以批次的方式显示top的刷新
            
            -n # : 显示的批次

            


    6, htop 



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

        # htop [options]

         常用选项:

            u : 交互式选择显示指定用户的进程
            
            l : 显示光标所在进程所打开的文件列表
            
            s :  显示光标所在进程执行的系统调用
            
            a : 绑定进程到指定的CPU
            
            # : 快速定位光标PID为#的进程上
            
            F1: 获取帮助

          

     7,vmstat 报告虚拟内存统计信息。




        常用用法:

        # vmstat 默认以1秒刷新一次,一直显示

        # vmstat -n 3 以3秒钟刷新一次,一直显示

        # vmstat -n 2 5 以2秒钟刷新一次,刷新5次 

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 590080  47652 277284    0    0     4     2    9    8  0  0 100  0  0
 0  0      0 589948  47652 277312    0    0     0     0   42   30  0  1 100  0  0

        看看每个字段的意思:         

        procs :

            r : 运行队列的长度

            b : 被阻塞(等待IO完成)队列的长度


        memory:    

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

            free : 空闲物理内存

            buff :  缓冲 (加速写)

            cache : 缓存(加速读)


        swap:

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

            so : swap out 数据离开swap中的数据速率 , kb/s

        

        io:

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

            bo : block out, 保存至块设备的数据速率 , kb/s

        

        system:

            in : interrupt , 中断速率

            cs : context switch ,上下文(进程)切换速率            


        cpu: us, sy, id, wa, st (同上面)

        

       选项:

           vmstat -s :  显示内存统计数据



    7,kill,killall



         进程间通信的方式之一就是通过发送信号(signal),那么就可以使用kill,killall来发送信号

     显示常用信号:

        # kill -l

        # man 7 signal        

[root@www ~]# kill -l
 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL10) SIGUSR1
11) SIGSEGV12) SIGUSR213) SIGPIPE14) SIGALRM15) SIGTERM
16) SIGSTKFLT17) SIGCHLD18) SIGCONT19) SIGSTOP20) SIGTSTP
21) SIGTTIN22) SIGTTOU23) SIGURG24) SIGXCPU25) SIGXFSZ
26) SIGVTALRM27) SIGPROF28) SIGWINCH29) SIGIO30) SIGPWR
31) SIGSYS34) SIGRTMIN35) SIGRTMIN+136) SIGRTMIN+237) SIGRTMIN+3
38) SIGRTMIN+439) SIGRTMIN+540) SIGRTMIN+641) SIGRTMIN+742) SIGRTMIN+8
43) SIGRTMIN+944) SIGRTMIN+1045) SIGRTMIN+1146) SIGRTMIN+1247) SIGRTMIN+13
48) SIGRTMIN+1449) SIGRTMIN+1550) SIGRTMAX-1451) SIGRTMAX-1352) SIGRTMAX-12
53) SIGRTMAX-1154) SIGRTMAX-1055) SIGRTMAX-956) SIGRTMAX-857) SIGRTMAX-7
58) SIGRTMAX-659) SIGRTMAX-560) SIGRTMAX-461) SIGRTMAX-362) SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX

      每个信号都可以使用三种方式之一在kill进行调用

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

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

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


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

            2) SIGINT : interrupt, 相当于 Ctrl + c  打断正在运行中的程序

            9)  SIGKILL :  直接终止进程 

            15) SIGTERM :  优雅的关闭默认是这种情况


        kill ,killall 语法

            # kill [-SIGNAL] PID             

                kill默认发的信号是15

            # killall [-SIGNAL] COMMAND

                终止所有一类进程        

                例如:# killall httpd        


    8,nice , renice  调整进程的优先级


        nice值  -20 ~ 19 越小优先级越高 普通用户0-19


        (1) 直接启动一个进程,并指定其Nice值:

        语法 :nice -n # COMMAND

        例如:     

      [root@www ~]# nice -n -5 vim /etc/issue        
      [root@www ~]# ps axo pid,pri,ni,command | grep vim
       3249  19   0 vim /etc/yum.repos.d/Base.repo
       3741  24  -5 vim /etc/issue

      

        (2) 修改正在运行的进程的优先级

         语法: renice -n # -p PID    

         例如:# renice -n 3 3772   

        [root@www ~]# ps axo pid,pri,ni,command | grep vim    
         3249  19   0 vim /etc/yum.repos.d/Base.repo
         3772  24  -5 vim /etc/issue
         3774  19   0 grep vim
        [root@www ~]# renice -n 3 3772
        3772: old priority -5, new priority 3
        [root@www ~]# ps axo pid,pri,ni,command | grep vim
         3249  19   0 vim /etc/yum.repos.d/Base.repo
         3772  16   3 vim /etc/issue

    

   9,jobs bg fg - Linux作业控制


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

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


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

    如何将作业运行于后台:


    (1) 运行中的作业:

        Ctrl + z :  送往后台后,作业将会被停止(STOPPED 状态)

        例如:        

        [root@www ~]# vim /etc/inittab 
        
        [1]+  Stopped                 vim /etc/inittab
        [root@www ~]# ps axu | grep "vim /etc/inittab"
        root      3809  0.0  0.3 143696  3836 pts/2    T    04:03   0:00 vim /etc/inittab

    

    (2) 尚未启动作业:

            COMMAND &

        此类由手动方式控制的作业,与终端相关作业会被终止:如果把作业送往后台,        且与终端无关:

        # nohup COMMAND &

    

    查看作业号:

       # jobs       

[root@www ~]# jobs
[1]+  Stopped                 vim /etc/fstab

     

    作业控制命令:

        # fg [[%]JOBNUM] :   将指定的作业调回前台

        # bg [[%]JOBNUM] :  让送往后台的作业在后台继续运行

        # kill %JOBNUM : 终止指定的作业        

        例如:

# 将指定的作业调回前台:

[root@www ~]# jobs
[1]+  Stopped                 vim /etc/inittab
[root@www ~]# fg 1
# 让送往后台的作业在后台继续运行

[root@www ~]# tar jcf  /tmp/etc.tar.gz /etc
tar: Removing leading `/‘ from member names
^Z
[1]+  Stopped                 tar jcf /tmp/etc.tar.gz /etc
[root@www ~]# jobs
[1]+  Stopped                 tar jcf /tmp/etc.tar.gz /etc
[root@www ~]# bg 1
[1]+ tar jcf /tmp/etc.tar.gz /etc &
[1]+  Done                    tar jcf /tmp/etc.tar.gz /etc


三、实战:screen后台实时执行命令备份命令


1 安装screen包

[root@xuegod63
~]# rpm -ivh /mnt/Packages/screen-4.0.3-16.el6.x86_64.rpm
2 直接在命令行键入screen命令

3 [root@xuegod63 tmp]# vim 1.sh
  命令模式按ctrl+a+d,出现[detached] 即可,再关闭pst
  
4 重新打开一个pst窗口执行

[root@xuegod63 ~]# screen -ls
There is a screen on:
        2330.pts-0.xuegod63     (Detached)
1 Socket in /var/run/screen/S-root.

5 [root@xuegod63 ~]# screen -r 2330  #就可以继续进行原来的进程



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