• Linux进程管理--------【We are all in the gutter, but some of us are looking at the stars. 我们都生活在阴沟里,但仍有人仰望星空。】


    进程管理

    程序:二进制文件,静态 /bin/date,/usr/sbin/sshd
    进程:是程序运行的过程,动态,有生命周期及运行状态。

    下图所示的是进程的生命周期:

    所谓的进程也就是运行的程序(running program),通俗一点就是所写的代码正在运行的过程。代码本来是静止的才叫程序,但是当程序开始被执行的时候,这段程序就叫做进程了。

    很明显程序在被执行,所以进程是动态的,而程序是静止的。这也就是程序与进程的区别。

    父进程复制自己的地址空间(fork  [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和父进程 ID (PPID)是子进程

    环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

    centos5或6PID为1的进程是: init  

    centos7 PID为1的进程是:     systemd

    僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸

    进程。

    用自己的话表达:父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,就变成僵尸进程。

    进程的属性

    进程ID(PID):是唯一的数值,用来区分进程

    进程状态:状态分为运行R休眠S僵尸Z

    使用ps查看进程工具

    a: 显示跟当前终端关联的所有进程

    u: 基于用户的格式显示(U: 显示某用户ID所有的进程)

    x: 显示所有进程,不以终端机来区分

    [root@localhost ~]# ps aux
    USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root          1  0.0  0.5 128332  5088 ?        Ss   16:37   0:03 /usr/lib/systemd/systemd
    root          2  0.0  0.0      0     0 ?        S    16:37   0:00 [kthreadd]
    root          3  0.0  0.0      0     0 ?        S    16:37   0:00 [ksoftirqd/0]
    root          5  0.0  0.0      0     0 ?        S<   16:37   0:00 [kworker/0:0H]
    root          7  0.0  0.0      0     0 ?        S    16:37   0:00 [migration/0]
    root          8  0.0  0.0      0     0 ?        S    16:37   0:00 [rcu_bh]
    root          9  0.0  0.0      0     0 ?        R    16:37   0:00 [rcu_sched]
    root         10  0.0  0.0      0     0 ?        S<   16:37   0:00 [lru-add-drain]
    root         11  0.0  0.0      0     0 ?        S    16:37   0:00 [watchdog/0]
    root         13  0.0  0.0      0     0 ?        S    16:37   0:00 [kdevtmpfs]
    root         14  0.0  0.0      0     0 ?        S<   16:37   0:00 [netns]
    root         15  0.0  0.0      0     0 ?        S    16:37   0:00 [khungtaskd]
    root         16  0.0  0.0      0     0 ?        S<   16:37   0:00 [writeback]
    root         17  0.0  0.0      0     0 ?        S<   16:37   0:00 [kintegrityd]
    root         18  0.0  0.0      0     0 ?        S<   16:37   0:00 [bioset]
    root         19  0.0  0.0      0     0 ?        S<   16:37   0:00 [kblockd]
    root         20  0.0  0.0      0     0 ?        S<   16:37   0:00 [md]
    root         21  0.0  0.0      0     0 ?        S<   16:37   0:00 [edac-poller]
    root         27  0.0  0.0      0     0 ?        S    16:37   0:00 [kswapd0]
    root         28  0.0  0.0      0     0 ?        SN   16:37   0:00 [ksmd]

    注:最后一列[xxxx] 使用方括号括起来的进程是内核态的进程。没有括起来的是用户态进程。

    上面的参数输出每列含意:

    USER: 启动这些进程的用户

    PID: 进程的ID

    %CPU 进程占用的CPU百分比; 
    %MEM 占用内存的百分比; 

    VSZ:进程占用的虚拟内存大小(单位:KB) 
    RSS:进程占用的物理内存大小(单位:KB) 

    STAT:该程序目前的状态,Linux进程有5种基本状态:

         R :该程序目前正在运作,或者是可被运作;

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

         T :该程序目前正在侦测或者是停止了;

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

         D  不可中断状态.  

    5个基本状态后,还可以加一些字母,比如:Ss、R+

    它们含意如下::

    <: 表示进程运行在高优先级上

    N: 表示进程运行在低优先级上

    L: 表示进程有页面锁定在内存中

    s: 表示进程是控制进程

    l: 表示进程是多线程的

    +: 表示当前进程运行在前台

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

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

    COMMAND:该程序的实际指令

    uptime查看系统负载

    [root@localhost ~]# uptime
     18:40:16 up  2:02,  3 users,  load average: 0.00, 0.01, 0.05

     弹出消息含意如下:

    当前时间 系统运行时间 当前登录用户 系统负载1分钟,5分钟,15分钟的平均负载

    top命令

    [root@localhost ~]# top
    top - 18:42:30 up  2:04,  3 users,  load average: 0.01, 0.02, 0.05
    Tasks: 202 total,   1 running, 201 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :   997956 total,    75148 free,   701468 used,   221340 buff/cache
    KiB Swap:  2097148 total,  2047484 free,    49664 used.    93236 avail Mem 
    
       PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND              
      4888 root      20   0  161972   2320   1584 R  0.3  0.2   0:00.28 top                  
         1 root      20   0  128332   5088   3072 S  0.0  0.5   0:03.92 systemd              
         2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd             
         3 root      20   0       0      0      0 S  0.0  0.0   0:00.26 ksoftirqd/0          
         5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H         
         7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0          
         8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh               
         9 root      20   0       0      0      0 S  0.0  0.0   0:00.91 rcu_sched            
        10 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 lru-add-drain        
        11 root      rt   0       0      0      0 S  0.0  0.0   0:00.12 watchdog/0           
        13 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs            
        14 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns                
        15 root      20   0       0      0      0 S  0.0  0.0   0:00.01 khungtaskd           
        16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback            
        17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd          

    第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。

    第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。

    第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,例如“97.1 id”意味着有

    97.1%的CPU处理器资源处于空闲。

    第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。

    第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。

    第6行: 

    PID — 进程id
    USER — 进程所有者
    PR — 进程优先级
    NI — nice值。负值表示高优先级,正值表示低优先级
    VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR — 共享内存大小,单位kb
    S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    %CPU — 上次更新到现在的CPU时间占用百分比
    %MEM — 进程使用的物理内存百分比
    TIME+ — 进程使用的CPU时间总计,单位1/100秒
    COMMAND — 进程名称(命令名/命令行)

    lsof命令

    lsof(list open files)命令用于查看你进程打开的文件,打开文件的进程,进程打开的端口(TCP、UDP)

    -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )

    [root@localhost ~]# lsof -i :22
    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    sshd    1086 root    3u  IPv4  25006      0t0  TCP *:ssh (LISTEN)
    sshd    1086 root    4u  IPv6  25016      0t0  TCP *:ssh (LISTEN)

    lsof输出各列信息的意义如下:

    COMMAND:进程的名称 PID:进程标识符

    USER:进程所有者

    FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等

    DEVICE:指定磁盘的名称

    SIZE:文件的大小

    NODE:索引节点(文件在磁盘上的标识)

    NAME:打开文件的确切名称

    FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或

    共享库,如上列表中显示的 /sbin/init 程序。

    其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是

    只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三

    个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

    与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出

    (FIFO) 队列和网际协议 (IP) 套接字。

    常用参数

    lsof语法格式是: lsof [options] filename

    lsof abc.txt 显示开启文件abc.txt的进程 lsof -c abc 显示abc进程现在打开的文件

    lsof -c -p 1234 列出进程号为1234的进程所打开的文件

    lsof -g gid 显示归属gid的进程情况

    lsof +d /usr/local/ 显示目录下被进程开启的文件

    lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长

    lsof -d 4 显示使用fd为4的进程 lsof -i 用以显示符合条件的进程情况

    lsof -i[46] [protocol][@hostname|hostaddr][:service|port]   46 --> IPv4 or IPv6   protocol --> TCP or UDP   hostname --> Internet host name   hostaddr --> IPv4地址   service --> /etc/service

    中的 service name (可以不止一个)   port --> 端口号 (可以不止一个)

  • 相关阅读:
    生活有时候就是个戏本
    Android dp、dpi、px
    iOS10以后相机、相册等授权问题
    iOS圆角性能问题
    激荡10年,珍贵的毕业礼物
    Android API 指南
    Android 配置
    Android Error
    安卓 MIUI真机测试
    iOS 同一段文字显示不同颜色
  • 原文地址:https://www.cnblogs.com/xiang-lu/p/10697897.html
Copyright © 2020-2023  润新知