进程管理

6. 进程管理

6.1 进程概念

在 Linux 系统当中:触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限配置。

程序被加载成为程序以及相关数据的示意图:

img
  • 程序 (program):

    通常为二进制程序放置在储存媒体中 (如硬盘、光盘、软盘、磁带等),为物理文件的形式存在;

  • 进程 (process):

    程序被触发后,运行者的权限与属性、程序的代码与所需数据等都会被加载内存中,操作系统并给予这个内存内的单元一个识别码(PID)。可以说,进程就是一个正在运行中的程序。

6.1.1 ps命令

ps命令可以:查看进程信息

  • 它可以确定有哪些进程正在运行以及进程运行的状态、
  • 进程是否结束,进程有没有僵死,
  • 哪些进程占用了过多的资源
#命令语法:
ps [选项]

命令中[选项]的含义:

  • -a:显示所有用户进程
  • -e:显示进程环境变量
  • -l:给出详细信息的列表
  • -r:只显示正在运行的进程
  • -S:增加CPU时间和页面出错的信息
  • -w:按宽格式显示输出
  • -u:打印用户格式,显示用户名和进程的起始时间
  • -x:显示不带控制终端的进程

ps命令输出字段的含义

  • USER:该进程属于哪个用户账号
  • PID :进程号,可以唯一标识该进程
  • %CPU:该进程使用掉的 CPU 资源百分比;
  • %MEM:该进程所占用的物理内存百分比;
  • VSZ :该进程使用的虚拟内存大小,以KB为单位
  • RSS :该进程占用的物理内存的总数量,以KB为单位
  • TTY :该进程是在那个终端机上面运行,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登陆者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
  • STAT:该程序目前的状态
    • R (Running):该程序正在运行中;
    • S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
    • D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况
    • T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
    • Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
  • START:该进程开始运行的时间
  • TIME :该进程实际使用的总CPU时间。
  • COMMAND:被执行的命令行

示例:

  1. 显示所有不带控制台终端的进程,并显示用户名和进程的起始时间。

    # a:显示所有用户进程 u:显示用户名和进程的起始时间 x:显示不带控制终端的进程
    [root@bogon ~]# ps -aux
    
    img
  2. 查看less进程是否在运行

    [root@bogon ~]# ps -ax | grep less
    
    img
    1. less命令用于对文件或其它输出进行分页显示,less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前不会加载整个文件。
    2. 命令格式:less [参数] 文件
    3. 使用less时,可以使用[pageup]、[pagedown]等按键向前或向后翻看文件
    4. 命令grep是查找, 中间 | 是管道命令,代表ps与grep同时执行。grep是一种强大的文本搜索工具,它能使用正则搜索文件,并把匹配的行打印出来。下面是匹配与nginx字符有关的进程, 用grep过滤后进程信息列名也屏蔽了。

    88a479c65b7fa91611ce8478a19f47ed.png

  3. 显示系统进程

    [root@bogon ~]# ps 
    
    img
  4. 显示用户名和进程的起始时间

    [root@bogon ~]# ps –u
    
    img
  5. 显示用户root的进程

    [root@bogon ~]# ps –u root | more
    
    img

    注:

    • less可以按上下方向键来显示上下内容,而more不能通过上下方向键控制显示;
    • less不必读整个文件,加载速度比more更快;
    • less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容。

6.1.2 top命令

top命令可以显示当前正在运行的进程以及关于它们的重要信息,是持续监测进程运行状态。而ps命令是选取一个时间点的进程状态。

#命令语法:
top [-d 数字] [-bnp]

命令中部分[选项]的含义:

  • -d:后面可以接秒数,就是整个进程界面更新的秒数。默认是5秒。
  • -b:以批次的方式运行 top ,还有更多的参数可以使用。通常会搭配输出重定向来将批处理的结果输出成为文件。
  • -n:与 -b 搭配,意义是,需要进行几次 top 的输出结果。
  • -p:指定某些个 PID 来进行观察监测而已。

在 top 运行过程当中可以使用的按键命令:

  • ?:显示在 top 当中可以输入的按键命令
  • P:以 CPU 的使用资源排序显示
  • M:以内存的使用资源排序显示
  • N:以 PID 来排序
  • T:由该进程使用的 CPU 时间累积 (TIME+) 排序
  • k:给予某个 PID 一个信号 (signal)
  • r:给予某个 PID 重新制定一个 nice 值
  • q:离开 top 软件的按键

注:top命令的其他选项,可以参考 man top 帮助文档。

常用操作:

#每隔5秒显式所有进程的资源占用情况
[root@bogon ~]#top   
#每隔2秒显式所有进程的资源占用情况
[root@bogon ~]#top -d 2  
#每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
[root@bogon ~]#top -p 12345 -p 6789  

例:使用top命令查看整体信息,每2秒更新一次进程信息。

[root@bogon ~]# top -d 2
image-20240616154057896
  1. top 主要分为两个界面,上面的界面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
    • 第一行(top...):这一行显示的信息分别为:
      • 目前的时间,即是 22:01:54 那个选项;
      • 启动到目前为止所经过的时间,即是 up 2:57 那个选项;
      • 已经登陆系统的使用者人数,即是 2 user项目;
      • load average:系统在 1, 5, 15 分钟的平均工作负载,即系统平均要负责运行几个程序(工作)的意思。越小代表系统越闲置,若高于1得要注意你的系统程序是否太过繁复了!
    • 第二行(Tasks...):显示的是目前程序的总量与个别程序在什么状态(running,sleeping,stopped,zombie)。比较需要注意的是最后的 zombie 那个数值,如果不是0,需要检查是哪个进程变成僵尸进程。
    • 第三行(Cpus...):显示的是 CPU 的整体负载,每个选项可使用 ? 查阅。需要特别注意的是 %wa ,那个选项代表的是I/O wait, 通常系统会变慢都是 I/O 产生的问题比较大!因此需要注意这个项目耗用 CPU 的资源!
    • 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。要注意的是 swap 的使用量要尽量的少!如果 swap 被大量使用,表示系统的物理内存实在不足!
    • 第六行:当在 top 程序当中输入命令时,显示状态的地方。 (输入k或r等)
  2. top 下半部分的界面,则是每个进程使用的资源情况。需要注意的是:
    • PID :每个进程的 ID
    • USER:该进程所属的用户
    • PR :Priority 的简写,程序的优先执行顺序,越小越早被执行
    • NI :Nice 的简写,与 Priority 有关,也是越小越早被执行
    • %CPU:CPU 的使用率
    • %MEM:内存的使用率
    • TIME+:CPU 使用时间的累加

6.1.3 pgrep命令

pgrep命令是通过程序的名字来查询进程,一般是用来判断程序是否正在运行,并查找正在运行进程的PID信息。

#命令语法:
pgrep [选项] 程序名

常用选项:默认只显示PID

  • -l 同时显示进程名和PID
  • -o 当匹配多个进程时,显示进程号最小的那个
  • -n 当匹配多个进程时,显示进程号最大的那个

注:进程号越大,并不一定意味着进程的启动时间越晚

例:使用pgrep命令查找远程登录程序ssh的进程信息

[root@bogon ~]#pgrep ssh
[root@bogon ~]# pgrep -l ssh
[root@bogon ~]# pgrep -o ssh
[root@bogon ~]# pgrep -n ssh
img

6.2 进程状态

6.2.1 五种进程状态

进程由父进程创建,每个进程包含下面五种状态:

  • R (Running):该程序正在运行中;
  • S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
  • D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况
  • T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
  • Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。

6.2.2 pstree命令

pstree命令以树状图显示进程间的关系,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。

#命令格式:
pstree [-A|U] [-up]

常用选项:

  • -A :各程序树之间的连接,以 ASCII 字符来连接;
  • -U :各程序树之间的连接,以utf-8码的字符来连接。在某些终端接口下可能会有错误;
  • -p :同时列出每个进程的 PID;
  • -u :同时列出每个进程的所属帐号名称。

例1:列出目前系统上所有进程树的相关性:

pstree -A
img

6.3 进程的管理

在linux中,进程之间通过信号(signal)来进行异步通信,并由kill来发送信号。我们可以使用kill –l(小写的L)或者man 7 signal来查找signal的信息。

6.3.1 主要的信号代号与名称

代号 名称 内容
1 SIGHUP 启动被终止的程序,可让该 PID 重新读取自己的配置文件,类似重新启动
2 SIGINT 相当于用键盘输入[ctrl]-c来中断一个程序的进行
9 SIGKILL 代表强制中断一个进程的进行,如果该程序进行到一半,那么尚未完成的部分可能会有“半产品”产生,类似vim会有.filename.swp 保留下来。
15 SIGTERM 以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的操作会将它完成。不过,如果该进程已经发生问题,就是无法使用正常的方法终止时,输入这个signal也是没有用的。
17 SIGSTOP 相当于用键盘输入[ctrl]-z来暂停一个进程的进行

6.3.2 kill命令

kill指令就像是Windows系统中的任务管理->结束任务一样。基本语法:

  • kill [选项] 进程号(功能描述:通过进程号杀死进程)
  • killall 进程名称 (功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负 载过大而变得很慢时很有用)
  • 常用选项: -9 :表示强迫进程立即停止

通过kill命令:传递信号

#语法格式:
kill –signal PID

例:结束进程名为top的进程

  1. 查看进程信息,进程名为top的进程号是4742;

    img

  2. 然后结束该进程,如下所示:

    img

注:确定该进程是否终止的方法是再次使用ps命令查看该进程的PID或进程名是否存在。

6.3.3 killall命令

Linux系统中的killall命令用于:杀死指定名字的进程。

我们可以使用kill命令杀死指定PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一。

#语法格式:
killall –signal 命令名称 

例:结束top命令的进程

img

6.4 作业控制

作业控制(job control)是在单一终端机下同时进行多个工作的行为管理,它分为前台进程和后台进程。

  • 前台:你可以控制和执行命令的这个环境称为前台(foreground) 的工作
  • 后台:可以自行运行的工作,你无法使用 [ctrl]+c 终止它,可使用 bg/fg 调用该工作

6.4.1 Ctrl+z

[Ctrl]+z表示将目前的工作丢到后台中暂停

例:使用vi打开文件后,并按[Ctrl]+z

img

6.4.2 jobs命令

jobs命令用来查看目前的后台工作状态

#命令语法:
jobs [-lrs]

常用选项:

  • -l :除了列出 job number 与命令串之外,同时列出 PID 的号码;
  • -r :仅列出正在后台 run 的工作;
  • -s :仅列出正在后台当中暂停 (stop) 的工作。

例:查看目前所有的工作和对应的PID

img

6.4.3 fg命令

fg命令表示将后台工作拿到前台来处理

#命令语法:
fg %jobnumber

选项与参数:

  • %jobnumber :jobnumber 为工作号码(数字)。
  • 注意,那个 % 是可有可无的!

例:将暂停的工作PID为5327,拿到前台来,重回vi界面。

image-20240616155623782

注:%1中的值1,为暂停的工作号[1]。

6.4.4 bg命令

bg命令用于将作业放到后台运行,使前台可以执行其他任务

#命令语法:
bg %jobnumber

选项与参数:

  • %jobnumber :jobnumber 为工作号码(数字)。
  • 注意,那个 % 是可有可无的!

总结

image-20240616162354985
posted @ 2024-06-16 16:24  Sunflower0312  阅读(59)  评论(0)    收藏  举报