Linux进程管理

目录

一、查看进程

1. 程序

2. 进程

2.1 概述

2.2 进程的特征

2.3 进程使用内存的问题 

2.4 进程的状态

2.5 进程的优先级os

2.6 进程的分类

2.7 进程与线程

二、控制进程

1. ps

1.1 概述

1.2 常用选项

1.3 字段说明

1.4 父子关系与排序

1.5 自定义显示字段

2. top

2.1 概述

2.2 进程的性能(上半部分)

2.3 进程的状态(下半部分)

2.4 top常用内部指令

2.5 top使用技巧

3. pgrep

4. pstree

5. lsof


一、查看进程

1. 程序

程序是特定任务的一串代码,是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。用于描述进程要完成的功能,是控制进程执行的指令集。

2. 进程

2.1 概述

进程是运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,进程是有生命周期的。centos6及之前由init串行启动管理进程;从centos7以后为systemd并行启动管理进程。进程都由其父进程创建,fork(),centos最初的父进程是systemd(pid=1)。

[root@localhost ~]# bash
[root@localhost ~]# pstree -p | grep bash
           |-sshd(1190)-+-sshd(1262)---bash(2095)---bash(3282)-+-grep(3408)
           |            `-sshd(3362)---bash(3372)

bash(2095)和bash(3282)为父子关系,bash(2095)和bash(3372)为兄弟关系。

2.2 进程的特征

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
  • 并发性:任何进程都可以同其他进程一起并发执行;
  • 独立性:进程是系统进行资源分配和调度的一个独立单位;
  • 结构性:进程由程序、数据和进程控制块三部分组成。

2.3 进程使用内存的问题 

内存不足:OOM

OOM 即 Out Of Memory,“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到相关的提示。

2.4 进程的状态

Linux进程管理_第1张图片

  • 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
  • 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态
  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

2.5 进程的优先级os

Linux进程管理_第2张图片

系统中的两种优先级:在top中显示的优先级有两个,PR值和nice值    

Nice Level优先级,Nice即NI;PR系统内置的优先级,不能控制;PR=NI+20。启动进程时,通常会继承父进程的nice级别,默认为0。

NI:实际nice值                  
PR(+-20):将nice级别显示为映射到更大优先级别队列,-20映射到0,+19映射到39  

特性: 

nice值越大:表示优先级越低,例如 +19               
nice值越小:表示优先级越高,例如 -20 

优先级查看与管理:

[root@localhost ~]# ps axo pid,comm,ni    #显示pid,进程名,nice值

[root@localhost ~]# sleep 8000 &          #sleep命令可以用来将目前动作延迟一段时间,&后台运行
[1] 2675
[root@localhost ~]# ps axo pid,command,nice  | grep  sleep
  2675 sleep 8000                    0
  2683 sleep 60                      0    #系统自带计时器
  2685 grep --color=auto sleep       0    #搜索程序本身
[root@localhost ~]# renice -n -20 2675    #renice重置现有优先级
2675 (进程 ID) 旧优先级为 0,新优先级为 -20    
[root@localhost ~]# ps axo pid,command,nice  | grep  sleep
  2675 sleep 8000                  -20
  2694 sleep 60                      0
  2697 grep --color=auto sleep       0

[root@localhost ~]# nice -n -10 sleep 6000 &  #启动指定nice级别的进程
[2] 2826
[root@localhost ~]# ps axo pid,command,nice  | grep  sleep
  2675 sleep 8000                  -20
  2824 sleep 60                      0
  2826 sleep 6000                  -10        #nice值为-10
  2828 grep --color=auto sleep       0

2.6 进程的分类

  • 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
  • 前台进程:跟终端相关,通过终端启动的进程

2.7 进程与线程

线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。

Q:如何确认一个程序是单线程还是多线程? 

查看改程序的详细状态

[root@localhost ~]# cat /proc/该程序的pid/status

[root@localhost ~]# grep -i threads /proc/该程序的pid/status

[root@localhost ~]# prtstat 该程序的pid

二、控制进程

1. ps

1.1 概述

ps命令可以静态查看进程当前状态,默认显示当前终端中的进程。

1.2 常用选项

  • a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。
  • u:使用以用户为主的格式输出进程信息。
  • x:显示当前用户在所有终端下的进程信息,不以终端机来区分。
  • -e:显示系统内的所有进程信息。
  • -l:使用长(Long)格式显示进程信息。
  • -f:使用完整的(Full)格式显示进程信
  • k|--sort 属性 对属性排序,属性前加 - 表示倒序 ps aux k -%cpu
  • o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem

1.3 字段说明

[root@localhost ~]# ps aux | head -n3
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128384  6976 ?        Ss   12:19   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    12:19   0:00 [kthreadd]
  • USER:运行进程的用户
  • PID:进程ID,程序的名字  PPID:父系程序的名字
  • %CPU:CPU占用率
  • %MEM:内存占用率
  • VSZ:占用虚拟内存
  • RSS:占用实际内存
  • TTY:进程运行的终端——?没有终端;pts某一个终端
  • STAT:进程状态man ps(/STATE)
  • START:进程启动的时间
  • TIME:进程启动时间
  • COMMAND:进程文件,进程名

ps aux #如果看到STAT为Z,表示为僵尸态。Q:如何过滤僵尸进程?

[root@localhost ~]# ps aux | grep -v grep | grep Z
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

1.4 父子关系与排序

[root@localhost ~]# ps -ef | head -n 3                     
#显示列C表示cpu利用率,查看进程父子关系PID(自己的身份证号)PPID(父系)
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:11 ?        00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 15:11 ?        00:00:00 [kthreadd]
[root@localhost ~]# ps  aux  --sort %cpu | head -n 3       
#升序查看cpu利用率,或者ps aux k %cpu | head -n 3
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128384  7112 ?        Ss   15:11   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    15:11   0:00 [kthreadd]
[root@localhost ~]# ps  aux  --sort -%cpu | head -n 3      
#降序查看cpu利用率,或者ps aux k -%cpu | head -n 3
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        721  0.2  0.2 295564  5300 ?        Ssl  15:11   0:26 /usr/bin/vmtoolsd
root        415  0.1  0.0      0     0 ?        S    15:11   0:14 [xfsaild/dm-0]

1.5 自定义显示字段

[root@localhost ~]# ps axo user,pid,ppid,%mem,command | head -3  
#自定义显示用户名,pid,父pid,内存占用率,进程名前三行信息
USER        PID   PPID %MEM COMMAND
root          1      0  0.3 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0.0 [kthreadd]

2. top

2.1 概述

top命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。

[root@localhost ~]# top | head 
top - 19:52:14 up  4:40,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 172 total,   1 running, 171 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
KiB Mem :  1863028 total,   928920 free,   530992 used,   403116 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  1155968 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                           
  5728 root      20   0  162100   2224   1536 R   6.2  0.1   0:00.01 top                                               
     1 root      20   0  128384   7112   4220 S   0.0  0.4   0:04.13 systemd                                           
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.05 kthreadd 

2.2 进程的性能(上半部分)

第一行:程序名-系统时间,运行时间,登录用户数,CPU负载1分钟5分钟15分钟(cpu负载三个时间点的平均值)

第二行:任务总进程数172,运行数1,睡眠数171,停止数0,僵死数0

第三行:cpu使用占比,us用户 ,sy系统,ni优先级,id空闲,wa等待处理所耗时间,hi硬件耗时,si软件耗时,st虚拟机

第四行:物理内存K,total总共, free空闲,userd使用,buff写缓存、cache读缓存硬盘内容,缓存多了会造成卡顿

缓冲(buffer)和缓存(cache)的区别:

  • 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取

  • 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能

第五行:虚拟内存(交换分区),当内存不够时,将硬盘空间当作内存使用

2.3 进程的状态(下半部分)

PID,USER,%CPU,%MEM同上“1.3”,介绍见前部分

VIRT:virtual memory usage 虚拟内存

RES:resident memory usage 常驻内存

SHR:shared memory 共享内存;除了自身进程的共享内存,也包括其他进程的共享内存

2.4 top常用内部指令

  • h|?帮助
  • M按内存的使用排序
  • P按CPU使用排序
  • N以PID的大小排序
  • < 向前
  • > 向后
  • z彩色,Z设置彩色

2.5 top使用技巧

top:回车,立刻刷新。按z彩色显示,按F,通过光标设置

top -d 1:每1秒刷新

top -d 1 -p pid:查看指定进程的动态信息

top -d 1 -p pid1,pid2:查看多个指定进程的动态信息

Q:cpu利用率高如何排查?

使用top或者ps aux命令查看进程,另外w和vmstat命令也可以查看

3. pgrep

查看指定的进程

  • -U 指定用户
  • -l: 显示进程名
  • -a: 显示完整格式的进程名
  • -P pid: 显示指定进程的子进程
[root@localhost ~]# pgrep -l "log"  #显示进程名
413 xfs-log/dm-0
630 xfs-log/sda1
730 abrt-watch-log
737 abrt-watch-log
754 systemd-logind
1195 rsyslogd
   
[root@localhost ~]# pidof bash     #根据进程名找pid号
4884 812                           #pid4884

Q:当前系统root用户一共运行了多少进程 ?

[root@localhost ~]# pgrep -U root | wc -l
129

4. pstree

以树形结构列出进程信息

  • -a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
  • -p 显示PID
  • -T 不显示线程thread,默认显示线程
  • -u 显示用户切换
  • -H pid 高亮显示指定进程及其前辈进程
[root@localhost ~]# pstree -p 1 | head -n1              #查看进程号为1的进程
systemd(1)-+-ModemManager(717)-+-{ModemManager}(733)
[root@localhost ~]# pstree root | head -n5              #查看用户lisi的进程
systemd-+-ModemManager---2*[{ModemManager}]
        |-NetworkManager---2*[{NetworkManager}]
        |-VGAuthService
        |-2*[abrt-watch-log]
        |-abrtd

5. lsof

lsof命令,“list opened files”的缩写,直译过来就是列举系统中已经被打开的文件。通过lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。

选项 功能
-c 字符串 只列出以字符串开头的进程打开的文件
+d 目录名 列出某个目录中所有被进程调用的文件
-u 用户名 只列出某个用户的进程打开的文件
-p pid 列出某个 PID 进程打开的文件
[root@localhost ~]# lsof | head -n5   #查询系统中所有进程调用的文件
COMMAND    PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                root  cwd       DIR              253,0       248         64 /
systemd      1                root  rtd       DIR              253,0       248         64 /
systemd      1                root  txt       REG              253,0   1632776   34040407 /usr/lib/systemd/systemd
systemd      1                root  mem       REG              253,0     20064     153450 /usr/lib64/libuuid.so.1.3.0

你可能感兴趣的:(进程,服务器)