Linux基础命令介绍九:进程与内存

系统 Linux
计算机存在的目的就是为了运行各种各样的程序,迄今我们介绍的绝大多数命令,都是为了完成某种计算而用编程语言编写的程序,它们以文件的形式保存在操作系统之中(比如/bin下的各种命令);但静态的程序并不能“自发的”产生结果,只有在操作系统中为其指定输入数据并运行起来,才能得到输出结果。而操作系统中程序运行的最主要表现形式便是进程。

计算机存在的目的就是为了运行各种各样的程序,迄今我们介绍的绝大多数命令,都是为了完成某种计算而用编程语言编写的程序,它们以文件的形式保存在操作系统之中(比如/bin下的各种命令);但静态的程序并不能“自发的”产生结果,只有在操作系统中为其指定输入数据并运行起来,才能得到输出结果。而操作系统中程序运行的最主要表现形式便是进程。

[[179650]]

静态程序可以长久的存在,动态的进程具有有限的生命周期。每次程序运行的开始(如键入一条命令后按下回车键),操作系统都要为程序的运行准备各种资源,这些资源绝大多数都处于内存之中。为了限制多用户进程的权限,linux还定义了两种进程运行时态:内核态和用户态;当进程想要请求系统服务时(比如操作一个物理设备),必须通过系统调用(操作系统提供给用户空间的接口函数)来实现,此时系统切换到内核态,代表程序执行该系统调用,执行完毕后系统切换回用户态,继续执行程序代码。

本文介绍linux中关于进程与内存的管理命令(更多的是查看命令)

1、uptime 系统运行时间

  1. uptime [options] 

单独执行此命令时,输出信息表示:当前时间,系统运行时长,登录用户个数,系统过去1、5、15分钟内的平均负载。

  1. [root@centos7 ~]# uptime 
  2.  10:46:38 up 58 days, 19:20,  3 users,  load average: 0.00, 0.01, 0.05  

2、ps 显示系统进程信息

  1. ps [options] 

单独运行ps命令时显示信息为:进程ID号(PID)、终端(TTY)、运行累积CPU时长(TIME)、命令名(CMD)

  1. [root@centos7 ~]# ps 
  2.   PID TTY          TIME CMD 
  3.  9503 pts/1    00:00:00 bash 
  4.  9570 pts/1    00:00:00 ps  

这里简要叙述一下关于进程、进程组、会话和终端的关系。linux操作系统为了方便管理进程,将功能相近或存在父子、兄弟关系的进程归为一组,每个进程必定属于一个进程组,也只能属于一个进程组。一个进程除了有进程ID外,还有一个进程组ID(PGID);每个进程组都有一个进程组组长,它的PID和进程组ID相同。像一系列相关进程可以合并为进程组一样,一系列进程组也可以合并成一个会话session。会话是由其中的进程建立的,该进程叫做会话的首进程(session leader)。会话首进程的PID即为此会话的SID(session ID)。每个会话都起始于用户登录,终止于用户退出。会话中的每个进程组称为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground),而其他的进程组是后台工作(background)。每个会话都关联到一个控制终端control terminal,当会话终止时(用户退出终端),系统会发送终止信号(SIGHUP)给会话中的所有进程组,进程对此信号的默认处理方式为终止进程。

ps接受三种格式的选项,带前缀符号-的UNIX格式的选项;不带前缀的BSD风格的选项;带两个-的GNU长格式选项。三种类型的选项可以自由组合,但可能会出现冲突。

选项a(BSD)表示显示所有和终端关联的进程信息,当配合选项x(BSD)一起使用时表示显示所有进程信息(此时终端无关的进程TTY列显示为?)。

选项-a(UNIX)表示显示与终端关联的除了会话首进程之外的进程信息。选项-e表示所有进程。

  1. [root@centos7 ~]# ps a 
  2.   PID TTY      STAT   TIME COMMAND 
  3.  2528 tty1     Ss+    0:00 -bash 
  4.  9336 pts/0    Ss     0:00 -bash 
  5.  9503 pts/1    Ss     0:00 -bash 
  6.  9550 pts/2    Ss+    0:00 -bash 
  7.  9571 pts/0    S+     0:00 man ps 
  8.  9582 pts/0    S+     0:00 less -s 
  9.  9643 pts/1    R+     0:00 ps a 
  10. [root@centos7 ~]# ps -a 
  11.   PID TTY          TIME CMD 
  12.  9571 pts/0    00:00:00 man 
  13.  9582 pts/0    00:00:00 less 
  14.  9644 pts/1    00:00:00 ps  

如例子中所示,BSD风格的选项还会显示进程的状态信息以及命令的参数。进程在运行的过程当中可能处于的状态包括:

  1. D 不可中断的睡眠状态(通常在等待IO) 
  2. R 正在运行或可以运行(在运行队列中) 
  3. S 可中断的睡眠状态(等待一个事件完成) 
  4. T 暂停状态 
  5. t 跟踪状态 
  6. W 换页状态(2.6内核以后版本) 
  7. X 死亡状态(不可见) 
  8. Z 僵死状态 
  9. #BSD风格的选项STAT列还可能包括以下字符 
  10. < 高优先级进程 
  11. N 低优先级进程 
  12. L 锁定状态 
  13. s 会话首进程 
  14. l 多线程进程 
  15. + 进程处于前台进程组  

选项u显示用户导向的进程信息(如进程的发起用户,用户态占用CPU和MEM百分比等)

  1. [root@centos7 ~]# ps au 
  2. USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
  3. root      2528  0.0  0.0 115636  2384 tty1     Ss+  9月30   0:00 -bash 
  4. root      9336  0.0  0.0 115596  2240 pts/0    Ss   08:44   0:00 -bash 
  5. root      9571  0.0  0.0 119196  1972 pts/0    S+   10:59   0:00 man ps 
  6. root      9582  0.0  0.0 110276   980 pts/0    S+   10:59   0:00 less -s 
  7. root      9835  0.0  0.0 115636  2172 pts/1    Ss   13:48   0:00 -bash 
  8. root      9938  0.0  0.0 115512  2096 pts/2    Ss   14:49   0:00 -bash 
  9. root      9960  0.0  0.0 154068  5632 pts/2    S+   14:50   0:00 vim others.sh 
  10. root      9967  0.0  0.0 139496  1640 pts/1    R+   14:59   0:00 ps au  

VSZ表示占用的总的地址空间大小。它包括了没有映射到内存中的页面。

RSS表示实际驻留"在内存中"的内存大小,不包括交换出去的内存。和VSZ的单位均为KB

通常查看所有进程信息会使用命令ps -ef或ps aux

选项-o或o表示指定输出格式

如显示所有bash进程的pid,命令名,运行于哪颗逻辑cpu:

  1. [root@centos7 ~]# ps -eo pid,comm,psr|grep bash 
  2.  2528 bash              1 
  3.  9336 bash              4 
  4.  9835 bash              3 
  5.  9938 bash              6  

配合选项--sort可指定按某一列排序输出

  1. #表示按用户名排序 
  2. ps -eo pid,user,args --sort user  

还可以用-o指定许多其他信息,请查询相关手册。

3、kill 终止进程

  1. kill [options] pid... 

命令kill会发送特定的信号给指定的进程或进程组,如果没有指定信号,则发送TERM信号

选项-l表示列出所有支持的信号: 

  1. [root@centos7 ~]# kill -l 
  2.  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 
  3.  6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1 
  4. 11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM 
  5. 16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP 
  6. 21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ 
  7. 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR 
  8. 31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3 
  9. 38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8 
  10. 43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 
  11. 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 
  12. 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7 
  13. 58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2 
  14. 63) SIGRTMAX-1  64) SIGRTMAX 
  15. [root@centos7 ~]#   

可以使用选项-s指定要发送的信号

如在一个终端启动进程sleep 300,在另一个终端查看并使用信号SIGKILL将其终止:

  1. [root@centos7 ~]# sleep 300 
  2. #此时会一直等待sleep执行完毕 
  3. #在另一个终端中 
  4. [root@centos7 temp]# ps -ef|grep [s]leep 
  5. root     10359  9835  0 12:05 pts/1    00:00:00 sleep 300 
  6. #发送信号 
  7. [root@centos7 temp]# kill -s SIGKILL 10359 
  8. #原终端显示 
  9. [root@centos7 ~]# sleep 300 
  10. 已杀死 
  11. [root@centos7 ~]#   

或者执行命令kill -9 10359是同样的效果。关于其他信号的作用,请自行搜索。

4、pgrep和pkill 搜索或者发送信号给进程

  1. pgrep [options] pattern 
  2. pkill [options] pattern  

这里的pattern是正则表达式,用来匹配进程名

如查看名称为gunicorn的所有进程

  1. [root@centos7 ~]# pgrep gunicorn 
  2. 17268 
  3. 17286 
  4. 17289 
  5. 17290 
  6. 17293  

选项-l显示进程名和pid

  1. [root@centos7 ~]# pgrep -l gun 
  2. 17268 gunicorn 
  3. 17286 gunicorn 
  4. 17289 gunicorn 
  5. 17290 gunicorn 
  6. 17293 gunicorn  

如终止所有sleep进程

  1. pkill sleep 

如使syslogd重读它的配置文件

  1. pkill -HUP syslogd 

5、top 显示进程信息

top命令实时动态的显示系统汇总信息和进程状态信息,它每隔1s刷新一次,按键盘q键退出。

单独执行top命令时显示如下输出:

  1. top - 03:20:02 up 59 days, 17:30,  3 users,  load average: 0.00, 0.01, 0.05 
  2. Tasks: 184 total,   1 running, 183 sleeping,   0 stopped,   0 zombie 
  3. %Cpu(s):  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
  4. KiB Mem :  8010720 total,  5100308 free,   420652 used,  2489760 buff/cache 
  5. KiB Swap:  8257532 total,  8257532 free,        0 used.  6905944 avail Mem  
  6.  
  7.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
  8.     1 root      20   0  193664   8708   2396 S   0.0  0.1   1:23.98 systemd 
  9.     2 root      20   0       0      0      0 S   0.0  0.0   0:00.44 kthreadd 
  10.     3 root      20   0       0      0      0 S   0.0  0.0   0:00.10 ksoftirqd/0 
  11.     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H 
  12.     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.34 migration/0 
  13.     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh 
  14.     9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0 
  15.    10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1  

下面分别对每行输出内容进行解释(注:top版本为3.3.10,其他版本的输出第四行和第五行可能不同)

***行显示信息和命令uptime的输出一致;

第二行显示任务汇总信息,状态即为进程可能状态中的四种;

第三行显示cpu负载信息,其中us表示用户态任务占用CPU时间百分比,sy表示内核态任务占用CPU时间百分比,ni表示改变过进程优先级的进程(通过nice或renice命令)占用CPU时间百分比,id表示CPU空闲时间百分比,wa表示等待输入输出的进程占用CPU时间百分比,hi表示硬件中断花费时间,si表示软件中断花费时间,st表示虚拟机等待真实物理机CPU资源的时间

第四行显示内存信息,total表示总内存,free表示未分配内存,used表示使用的内存(值为total-free-buff/cache的结果),buff/cache表示缓存内存;

第五行显示交换分区使用量,其中avail Mem表示启动一个新程序时可以分配给它的***内存,和第三行free列不同的地方在于,它会统计可以被回收的缓存分配器(slab)和页高速缓冲存储器(page cache)中的内存。(在一些较早的top实现中,并没有这一列的值)

接下来经过一个空行之后,显示的是进程相关信息,表头各列字段和ps命令的输出均有相对应的关系,其中PR表示优先级;NI表示nice值(后述);VIRT表示虚拟内存大小,对应ps命令中的VSZ;RES表示进程常驻内存大小,对应ps命令中的RSS;SHR表示共享内存大小;S表示进程状态,对应ps命令的STAT;

linux系统的进程状态中有一个优先级(priority)的概念,其值是一个动态变化的整数,范围是0-139,此值越小,则优先级越高,那么它就越优先被CPU执行。如果top命令PR列显示为rt,表示此进程为实时进程,它的优先级范围是0-99,比其他的普通进程都要高。linux中还有静态优先级的概念,用户可以通过使用命令nice和renice对进程设置或改变静态优先级,它可以看成是动态优先级的修正值,能够影响动态优先级的值。

PR列显示的值为实际优先级减去实时进程***优先级之后的值,3.10内核非实时进程的默认值为20,即:DEFAULT_PRIO = MAX_RT_PRIO + 20 = 120

NI列不为0时,表示进程被设置过静态优先级值,范围是-20到19,它与当前优先级值的关系是:DEFAULT_PRIO = MAX_RT_PRIO + (nice) + 20

如使用nice启动一个sleep进程:

  1. #当不使用选项-n指定时,默认值为10 
  2. [root@centos7 ~]# nice -n -10 sleep 300 
  3. #对于已存在的进程可以使用renice命令调整其静态优先级 
  4. [root@centos7 ~]#  
  5. [root@centos7 ~]# ps -eo pri,ni,comm|grep sleep 
  6. 29  -10 sleep 
  7. [root@centos7 ~]# 
  8. [root@centos7 ~]# top -bn1 |egrep 'COMMAND$|sleep$' 
  9.   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
  10. 11967 root      10 -10  107892    616    528 S   0.0  0.0   0:00.00 sleep 
  11. #注意这里ps和top优先级值显示的不同,ps命令pri列的值 29 = MAX_PRIO(139) -  MAX_RT_PRIO(100) + nice(-10)。它们实际的优先级值是相等的。  

上例中使用了选项-n表示top刷新次数,-b表示批处理模式运行top,此模式会去掉输出中的控制字符,方便将输出交给其他程序处理。

选项-o fieldname按指定列排序输出,选项-O可以列出-o能够指定的列名

  1. #自行执行命令查看效果 
  2. top -O |tr '\n' ' ' 
  3. top -bn1 -o PR  

下面简要介绍一些top中可以使用的交互命令:

  1. q 退出top 
  2. h 获得帮助信息 
  3. 1 显示每个逻辑cpu的信息 
  4. k 终止一个进程(会提示用户输入需要终止的pid,以及需要发送什么样的信号) 
  5. r 重新设置进程静态优先级(相当于执行renice) 
  6. i 忽略闲置和僵死进程 
  7. H 显示线程信息 
  8. M 根据驻留内存大小排序 
  9. P 根据CPU使用百分比排序 
  10. W 将当前设置写入~/.toprc文件中  

6、free 显示系统内存使用情况

  1. free [options] 

free命令显示系统当前内存、swap(交换分区)的使用情况,默认单位是KB

  1. #版本3.3.10 
  2. [root@centos7 ~]# free 
  3.               total        used        free      shared  buff/cache   available 
  4. Mem:        8010720      423060     4540476      375580     3047184     6897052 
  5. Swap:       8257532           0     8257532  

显示信息和top命令输出中的对应值一致,其中shared表示内存文件系统(tmpfs)中使用内存的大小。

前面讲述了available对应值所表示的含义,通常查看系统当前还有多少可用内存,看available的对应值就可以了。这里available = free + 缓存(可被回收部分)。

但在较老版本的free中并没有这个值,它的输出可能是这样的:

  1.              total       used       free     shared    buffers     cached 
  2. Mem:       8174384    4120488    4053896          0     229320    1041712 
  3. -/+ buffers/cache:    2849456    5324928 
  4. Swap:     16779884          0   16779884  

说明:

buffer(缓冲) 是为了提高内存和硬盘(或其他I/O设备)之间的数据交换的速度而设计的

cache(缓存) 是为了提高cpu和内存之间的数据交换速度而设计的

所以输出中buffers可简单理解为准备写入硬盘的缓冲数据;cached可理解为从硬盘中读出的缓存数据(页高速缓冲存储器),缓存中可被回收部分来自cached和slab(缓存分配器)

Mem行:used = total - free此时的空闲内存free列并不能体现系统当前可用内存大小

-/+ buffers/cache行:used = total - free(Mem) - (buffers + cached),这里的free列和前面所述的available关系为available = free + 缓存(可被回收部分)

所以当没有available列可查看时,并不能通过free命令查到或计算出真正可用内存,需要知道缓存部分的具体情况。

选项-b、-k、-m、-g分别表示指定各值的单位:bytes, KB, MB, 或者 GB

7、fuser 使用文件或套接字定位进程

fuser经常用来查看文件被哪些进程所使用

  1. [root@centos7 ~]# fuser . 
  2. /root:                2528c 11430c 11447c  

例子表示显示有三个进程在使用当前目录,其中:2528c 前面数字表示进程PID,后面的字符c表示当前目录(即进程在此目录下工作),还可能出现的字符有:

  1. e 表示进程正在运行执行文件 
  2. f 打开文件,默认输出时省略 
  3. F 写方式打开文件,默认时输出省略 
  4. r 根目录 
  5. m mmap文件或共享库文件  

选项-k表示发送信号SIGKILL给相关进程(谨慎使用)

选项-i表示交互,在kill一个进程之前询问用户

选项-l列出支持的信号

选项-SIGNAL指定信号

8、lsof 列出打开文件

在这一篇中我们简单描述了bash进程打开的前三个文件,并分别关联到文件描述符0,1,2。对于其他进程打开的文件也是同样,系统为每个进程维护一个文件描述符表,该表的值都是从0开始的数字。单独执行lsof命令时会显示系统中所有进程打开的文件

  1. #命令版本为4.87 
  2. [root@centos7 temp]# lsof |head 
  3. COMMAND     PID   TID    USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME 
  4. systemd       1          root  cwd       DIR              253,0      4096        128 / 
  5. systemd       1          root  rtd       DIR              253,0      4096        128 / 
  6. systemd       1          root  txt       REG              253,0   1489960       6044 /usr/lib/systemd/systemd 
  7. systemd       1          root  mem       REG              253,0     20032  201329002 /usr/lib64/libuuid.so.1.3.0 
  8. systemd       1          root  mem       REG              253,0    252704  201330338 /usr/lib64/libblkid.so.1.1.0 
  9. systemd       1          root  mem       REG              253,0     90632  201328968 /usr/lib64/libz.so.1.2.7 
  10. systemd       1          root  mem       REG              253,0     19888  201329137 /usr/lib64/libattr.so.1.1.0 
  11. systemd       1          root  mem       REG              253,0     19520  201328509 /usr/lib64/libdl-2.17.so 
  12. systemd       1          root  mem       REG              253,0    153192  201328867 /usr/lib64/liblzma.so.5.0.99  

每行一个打开的文件,表头各列意为:

  1. COMMAND 进程命令名前9个字符 
  2. PID     进程ID 
  3. TID     任务ID 
  4. FD  1)文件描述符号或者下面字符: 
  5.     cwd 当前工作目录 
  6.     err FD错误信息 
  7.     ltx 共享库代码 
  8.     mem 内存映射文件 
  9.     mmap 内存映射设备 
  10.     pd  父目录 
  11.     rtd 根目录 
  12.     txt 程序代码 
  13.     2)当是FD(数字)时,后面可能跟下面权限字符: 
  14.     r 读 
  15.     w 写 
  16.     u 读写 
  17.     空格 权限未知且无锁定字符 
  18.     - 权限未知但有锁定字符 
  19.     3)权限字符后可能有如下锁定字符: 
  20.     r 文件部分读锁 
  21.     R 整个文件读锁 
  22.     w 文件部分写锁 
  23.     W 整个文件写锁 
  24.     u 任意长度读写锁 
  25.     U 未知类型锁 
  26.     空格 无锁 
  27. TYPE    类型,可能值为: 
  28.     DIR 目录 
  29.     REG 普通文件 
  30.     CHR 字符设备文件 
  31.     BLK 块设备文件 
  32.     FIFO 管道文件 
  33.     unix UNIX套接字文件 
  34.     IPv4 IPv4套接字文件 
  35.     .... 
  36. DEVICE  设备号 
  37. SIZE/OFF 文件大小或偏移量(bytes) 
  38. NODE    文件inode号  

选项-n表示不做ip到主机名的转换

选项-c string显示COMMAND列中包含指定字符的进程所有打开的文件

选项-u username显示所属user进程打开的文件

选项-d FD显示打开的文件描述符为FD的文件

  1. [root@centos7 ~]# lsof -d 4 
  2. COMMAND     PID    USER   FD      TYPE             DEVICE SIZE/OFF      NODE NAME 
  3. systemd       1    root    4u  a_inode                0,9        0      5755 [eventpoll] 
  4. systemd-j   539    root    4u     unix 0xffff880230168f00      0t0     10467 /run/systemd/journal/socket 
  5. systemd-u   549    root    4u     unix 0xffff88003693d640      0t0     12826 /run/udev/control 
  6. lvmetad     555    root    4wW     REG               0,18        4      8539 /run/lvmetad.pid 
  7. auditd      693    root    4w      REG              253,0   701364 208737917 /var/log/audit/audit.log 
  8. ....  

选项+d DIR显示目录中被进程打开的文件

选项+D DIR递归显示目录中被进程打开的文件

  1. [root@centos7 ~]# lsof +d /root|head -3 
  2. COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME 
  3. bash     2528 root  cwd    DIR  253,0     4096 201326721 /root 
  4. bash    12902 root  cwd    DIR  253,0     4096 201326721 /root  

选项-i表示显示符合条件的进程打开的文件,格式为[46][protocol][@hostname|hostaddr][:service|port]

  1. #查看22端口运行情况 
  2. [root@centos7 ~]# lsof -ni :22 
  3. COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME 
  4. sshd     1358 root    3u  IPv4    8979      0t0  TCP *:ssh (LISTEN) 
  5. sshd     1358 root    4u  IPv6    8981      0t0  TCP *:ssh (LISTEN) 
  6. sshd    12900 root    3u  IPv4 3509687      0t0  TCP 10.0.1.254:ssh->192.168.78.143:57325 (ESTABLISHED) 
  7. #例子,smtp为/etc/services文件中列出服务中的一种 
  8. [root@centos7 ~]# lsof -ni 4TCP@0.0.0.0:22,smtp   
  9. COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME 
  10. sshd     1358 root    3u  IPv4    8979      0t0  TCP *:ssh (LISTEN) 
  11. master   2162 root   13u  IPv4   16970      0t0  TCP 127.0.0.1:smtp (LISTEN) 
  12. sshd    12900 root    3u  IPv4 3509687      0t0  TCP 10.0.1.254:ssh->192.168.78.143:57325 (ESTABLISHED)  

试想,如果删除了一个正在被其他进程打开的文件会怎样?实验来看看现象: 

  1. #使用more命令查看一个文件 
  2. [root@centos7 ~]# more /root/.bash_history 
  3. #在另一个终端使用lsof查看 
  4. [root@centos7 ~]# lsof|grep ^more 
  5. more      14470          root  cwd       DIR              253,0      4096  201326721 /root 
  6. more      14470          root  rtd       DIR              253,0      4096        128 / 
  7. more      14470          root  txt       REG              253,0     41096  134321844 /usr/bin/more 
  8. more      14470          root  mem       REG              253,0 106065056  134319094 /usr/lib/locale/locale-archive 
  9. more      14470          root  mem       REG              253,0   2107816  201328503 /usr/lib64/libc-2.17.so 
  10. more      14470          root  mem       REG              253,0    174520  201328905 /usr/lib64/libtinfo.so.5.9 
  11. more      14470          root  mem       REG              253,0    164440  225392061 /usr/lib64/ld-2.17.so 
  12. more      14470          root  mem       REG              253,0    272001   67147302 /usr/share/locale/zh_CN/LC_MESSAGES/util-linux.mo 
  13. more      14470          root  mem       REG              253,0     26254  201328839 /usr/lib64/gconv/gconv-modules.cache 
  14. more      14470          root    0u      CHR              136,1       0t0          4 /dev/pts/1 
  15. more      14470          root    1u      CHR              136,1       0t0          4 /dev/pts/1 
  16. more      14470          root    2u      CHR              136,1       0t0          4 /dev/pts/1 
  17. more      14470          root    3r      REG              253,0     17656  202386313 /root/.bash_history 
  18. #删除这个文件 
  19. [root@centos7 ~]# rm -f /root/.bash_history 
  20. #查看 
  21. [root@centos7 ~]# lsof -d 3|grep ^more 
  22. more      14470    root    3r      REG              253,0    17656  202386313 /root/.bash_history (deleted) 
  23. [root@centos7 ~]# 
  24. #会发现文件列多出了delete的字样  

linux系统中/proc目录保存了系统所有进程相关的数据,里面的数字目录名即为PID。我们进一步来看一下刚才的more进程的文件描述符

  1. [root@centos7 ~]# cat /proc/14470/fd/3 > /root/.bash_history.bak 
  2. #此操作会将文件描述符3中的内容保存至/root/.bash_history.bak 
  3. #停止more进程并查看 
  4. [root@centos7 ~]# ls -l /root/.bash_history* 
  5. -rw-r--r-- 1 root root 17656 11月 30 07:47 /root/.bash_history.bak 
  6. [root@centos7 ~]# cat /root/.bash_history.bak 
  7. #会发现原文件没有了,新文件保存了原文件的所有内容  

结论就是,如果在删除文件的时候有进程正在打开该文件,那么该文件的内容还是可以通过进程的对应文件描述符恢复的。同时,如果删除了某文件,发现空间并没有释放,说明有进程正在打开该文件(命令lsof|grep delete查看),重新启动该进程之后,空间就会得到释放。

9、iostat 显示CPU、I/O统计信息

  1. [root@centos7 ~]# iostat 
  2. Linux 3.10.0-327.el7.x86_64 (centos7)   2016年11月30日  _x86_64_        (8 CPU) 
  3.  
  4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle 
  5.            0.12    0.00    0.03    0.00    0.00   99.85 
  6.  
  7. Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn 
  8. sda               0.23         0.79         3.05    4178309   16079082 
  9. dm-0              0.22         0.57         2.94    3002207   15480498 
  10. dm-1              0.00         0.00         0.00       1088          0 
  11. dm-2              0.03         0.22         0.11    1146430     596232 
  12. dm-3              0.06         0.01         1.91      28900   10079073 
  13. dm-4              0.03         0.01         1.91      28644   10079073  

显示信息中cpu部分在命令top的描述中都有相应的解释,I/O部分是各个设备读写速率及总量信息,其中tps表示每秒多少次I/O请求

选项-c显示CPU信息

选项-d显示设备信息

选项-x显示更详细的信息

命令iostat m n数字(m,n),m表示时间间隔,n表示次数;此时iostat会每隔m秒打印一次,打印n次。

  1. [root@centos7 ~]# iostat -c 1 3 
  2. Linux 3.10.0-327.el7.x86_64 (centos7)   2016年11月30日  _x86_64_        (8 CPU) 
  3.  
  4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle 
  5.            0.12    0.00    0.03    0.00    0.00   99.85 
  6.  
  7. avg-cpu:  %user   %nice %system %iowait  %steal   %idle 
  8.            0.12    0.00    0.00    0.00    0.00   99.88 
  9.  
  10. avg-cpu:  %user   %nice %system %iowait  %steal   %idle 
  11.            0.12    0.00    0.12    0.00    0.00   99.75  

也可以接设备名表示查看指定设备的I/O信息

  1. [root@centos7 ~]# iostat sda 
  2. Linux 3.10.0-327.el7.x86_64 (centos7)   2016年11月30日  _x86_64_        (8 CPU) 
  3.  
  4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle 
  5.            0.12    0.00    0.03    0.00    0.00   99.85 
  6.  
  7. Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn 
  8. sda               0.23         0.79         3.05    4178309   16084862  

10、vmstat 显示虚拟内存统计信息

  1. vmstat [options] [delay [count]] 

同样也会显示一些CPU和I/O的信息

选项-w格式化输出

  1. [root@centos7 ~]# vmstat -w 
  2. procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- 
  3.  r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st 
  4.  1  0            0      4517628         3184      3067904    0    0     0     1    1    0   0   0 100   0   0  

其中

  1. procs 
  2.     r 表示可运行状态进程数量 
  3.     b 表示不可中断睡眠状态进程数量 
  4. memory 
  5.     swpd  虚拟内存使用量 
  6.     free  空闲内存 
  7.     buff  buffer缓冲中内存使用量 
  8.     cache cache缓存中内存使用量 
  9. swap 
  10.     si   硬盘交换至内存量 
  11.     so   内存交换至硬盘量 
  12. io 
  13.     bi   从块设备中收到的块(blocks)数 
  14.     bo   发送至块设备的块数 
  15. system 
  16.     in   每秒中断次数,包括锁。 
  17.     cs   每秒进程上下文切换次数。 
  18. cpu (同命令top
  19.     us   用户态任务占用CPU时间百分比 
  20.     sy   内核态任务占用CPU时间百分比 
  21.     id   CPU空闲时间百分比 
  22.     wa   等待输入输出的进程占用CPU时间百分比 
  23.     st   虚拟机等待真实物理机CPU资源的时间 

选项-m显示slab信息

选项-s显示各种内存计数器及其信息

选项-d显示磁盘I/O信息

选项-p device显示设备分区详细I/O信息

同iostat一样也支持按频率打印次数

11、mpstat 显示CPU相关信息

  1. mpstat [options] [interval [count]] 

显示信息和top命令相似

  1. [root@centos7 ~]# mpstat 1 2 
  2. Linux 3.10.0-327.el7.x86_64 (centos7)   2016年11月30日  _x86_64_        (8 CPU) 
  3.  
  4. 09时18分19秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle 
  5. 09时18分20秒  all    0.12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.88 
  6. 09时18分21秒  all    0.12    0.00    0.12    0.00    0.00    0.00    0.00    0.00    0.00   99.75 
  7. 平均时间:  all    0.12    0.00    0.06    0.00    0.00    0.00    0.00    0.00    0.00   99.81  

选项-A显示所有CPU及中断信息相当于执行mpstat -I ALL -P ALL

选项-I { SUM | CPU | SCPU | ALL }显示中断信息

选项-P { cpu [,...] | ON | ALL }显示CPU信息

  1. [root@centos7 ~]# mpstat -P 3,5 
  2. Linux 3.10.0-327.el7.x86_64 (centos7)   2016年11月30日  _x86_64_        (8 CPU) 
  3.  
  4. 09时29分03秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle 
  5. 09时29分03秒    3    0.15    0.00    0.04    0.00    0.00    0.00    0.00    0.00    0.00   99.81 
  6. 09时29分03秒    5    0.11    0.00    0.03    0.00    0.00    0.00    0.00    0.00    0.00   99.86  

本文简单介绍了linux中进程和内存的相关命令,进程和内存在计算机操作系统中非常重要,涉及到的内容也非常多,这里就不做展开了。

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2017-01-13 15:39:29

Linux进程基础介绍

2016-12-14 19:24:41

2010-06-13 15:13:45

Linux 查看进程

2015-07-21 16:06:49

Linux进程管理命令

2010-06-11 16:57:37

Linux 查看进程

2016-12-08 22:26:28

2016-12-27 10:48:59

Linux命令磁盘与文件系统

2015-06-03 10:17:12

Linux进程管理命令

2009-12-25 10:48:23

ps -aux

2013-11-06 15:01:51

Linux命令内存

2016-12-27 19:10:38

Linux命令启动流程

2016-12-29 11:13:30

shellbashlinux

2016-12-07 18:22:23

shelllinuxgrep

2016-12-27 19:29:14

Linux命令定时任务

2016-11-15 15:50:22

linux基础命令vim

2016-12-23 10:56:34

linuxshellawk

2016-12-23 13:07:11

shelllinuxsed

2016-12-27 10:34:57

Linux命令软件包管理

2010-07-01 14:52:42

Linux grep命

2010-06-04 15:16:36

Linux 查看进程
点赞
收藏

51CTO技术栈公众号