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 --> 端口号 (可以不止一个)

猜你喜欢

转载自www.cnblogs.com/xiang-lu/p/10697897.html
今日推荐