进程和计划任务管理

215 阅读21分钟

程序

什么是程序

程序: (电脑上所有都是程序)

  • 程序是执行特定任务的一串代码,存储在硬盘上,是静态的。
  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
  • 用于描述进程要完成的功能,是控制进程执行的指令集。
  • 保存在硬盘、光盘等介质中的可执行代码和数据。

进程

什么是进程

运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位。

[进程:在CPU以及内存中运行的程序代码叫进程。动态,存在内存中,有生命周期。]

  • 动态执行的代码
  • 运行在cpu和内存中一个程序代码。
  • 进程PID(Process ID)号码被用来标记各个进程
  • UID、GID语境决定对文件系统的存取和访问权限
  • 由父进程进行创建管理
  • 存在生命周期

线程和进程的关系

  1. 进程是操作系统资源分配的基本单位
  2. 线程是处理器任务调度和执行的基本单位
  3. 如果一个进程内有多个线程,则执行过程不是一条线的,而是多线程共同完成的,所以线程是进程的一部分
  4. 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
  5. 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉

线程

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。

线程的存在是为了阻止进程间切换

线程有优先级

可以从可以使用 cat /proc/进程PID/status 查看进程有几个线程也可以输入命令grep -i threads /proc/进程PID/status来精准查找有几个线程。

进程具有的特征:

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

为什么要管理进程

开启进程就要消耗硬件资源(cpu利用率、内存使用率、磁盘使用率),硬件资源消耗完了就会卡顿、死机。

中病毒、程序异常、程序设计不合理都有可能是内存占用率满的原因,通常情况下是不会造成此类原因。

进程使用内存的问题

  • 内存泄漏:Memory Leak

指程序申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态。

  • 内存溢出:Memory Overflow

指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出。

  • 内存不足:OOM (Out Of Memory)

关闭进程占用率较高的进程,关闭前要先确认关闭的进程是否有用,不可随意关闭。

pmap 进程号PID                      //查看进程占用的内存情况
[root@localhost /]# pmap 1096
1096:   /usr/sbin/sshd -D
000055a4a1ae8000    800K r-x-- sshd
000055a4a1daf000     16K r---- sshd
000055a4a1db3000      4K rw--- sshd

进程状态

image.png

进程的基本状态

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

进程更多的状态

  • 运行态:running
  • 就绪态:ready
  • 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
  • 僵尸态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵尸态的子进程

进程结束,父进程会回收子进程的硬件资源;
子进程如果出现意外关闭,父进程无感知就不会收回资源,就产生了僵尸进程。

僵尸进程

  • 搭建一个僵尸进程(停止父进程,杀掉子进程可得到状态为Z的僵尸进程) image.png

image.png

  • 解决僵尸进程可采取恢复父进程(kill -18 父进程)或者杀掉父进程(kill -9 父进程)也可重启程序。

image.png

查看进程信息

ps 查看静态进程统计信息

ps 即 (process state),可以查看进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/数字 目录/status 下的文件中。

ps命令支持三种语法格式:

  • UNIX风格。选项可以组合在一起,并且选项前必须有 "-" 连字符 。如:ps -ef。
  • GNU选项。选项前有两个 "-" 连字符 。如:ps --help。
  • BSD选项。选项可以组合在一起,但是选项前不能有 "-" 连字符。如:ps aux。

pa aux 显示当前进程所有详细信息(常用) image.png

选项功能
a显示终端上的所有进程,包括其它用户的进程与“x”选项结合时显示系统中所有的进程信息。
u表示列出进程的用户名
x显示所有终端的进程
-e显示系统内的所有进程信息
-l使用长格式显示进程信息
-f使用完整的格式显示进程信息
-a显示所有进程pid
-T查看线程信息
k , --sort对属性排序,属性前加 - 表示倒序
o选项显示定制的信息 pid、cmd、%cpu、%mem

ps aux -%mem倒序排序显示内存占用顺序 image.png

ps axo user,pid只查看选中的user和pid选项

image.png

ps -l 只能看到当前 Shell 产生的进程,不会显示所有进程

image.png

ps aux k -%cpu 按cpu利用率倒序排序

image.png

** prtstat 查看指定进程信息** image.png

  • ps aux各层代表意思 image.png
区块说明
USER进程是哪个的用户产生的
PID进程的ID号
%CPU进程占用CPU百分比,百分百越高cpu消耗越大,进程越消耗资源。(cpu利用率要看cpu的总块数一般情况下大于100%)
%MEM该进程占用内存百分比,占用的百分比越高,进程越耗费资源。
VSZ该进程使用的虚拟内存量(KB),虚拟内存仅代表预计量
RSS该进程占用的物理内存量(KB),这里的才是实际占用量
TTY启动进程终端名。该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程
STAT该进程的状态
START该进程启动时间
TIME该进程实际使用CPU运行的时间(该进程占用 CPU 的运算时间)
COMMAND产生此进程的命令名。

STAT进程状态(常见状态):

  • -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
  • -R:该进程正在运行。
  • -S:该进程处于睡眠状态,可被唤醒。
  • -T:停止状态,可能是在后台暂停或进程处于除错状态。
  • -W:内存交互状态(从 2.6 内核开始无效)。
  • -X:死掉的进程(应该不会出现)。
  • -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。
  • -<:高优先级(以下状态在 BSD 格式中出现)。
  • -N:低优先级。
  • -L:被锁入内存。
  • -s:包含子进程。
  • -l:多线程(小写 L)。
  • -+:进程位于后台。

cpu利用率要看cpu的总大小,本机的cpu使用最大值为200%

image.png

ps -elf可以查看系统中所有的进程,而且还能看到进程的父进程的 PID 和进程优先级

image.png

表头含义
F进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限;
S进程状态。具体的状态和"psaux"命令中的 STAT 状态一致;
UID运行此进程的用户的 ID;
PID进程的 ID;
PPID父进程的 ID;
C该进程的 CPU 使用率,单位是百分比;
PRI进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改
NI进程的优先级,数值越小,该进程越早被执行;可以人为修改
ADDR该进程在内存的哪个位置;
SZ该进程占用多大内存;
WCHAN该进程是否运行。"-"代表正在运行;
TTY该进程由哪个终端产生;
TIME该进程占用 CPU 的运算时间,注意不是系统时间;
CMD产生此进程的命令名;

在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice ( NI范围是 -20~19 )

寻找未知进程的执行程序文件路径(可以用来解决简单的病毒)

  • 模拟一个病毒进程,发现一个cpu占用率异常的项目

image.png

  • 根据PID号可以找出对应的文件 image.png

top命令 动态查看进程(任务管理器)

ps 命令可以一次性给出当前系统中进程状态,但使用此方式得到的信息缺乏时效性,并且,如果管理员需要实时监控进程运行情况,就必须不停地执行 ps 命令,这显然是缺乏效率的。

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

选项:

  • -d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒。
  • -b:使用批次处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中。
  • -n 次数:指定 top 命令执行的次数。一般和"-"选项合用。
  • -p 进程PID:仅查看指定 ID 的进程。
  • -s:使 top 命令在安全模式中运行,避免在交互模式中出现错误。
  • -u 用户名:只监听某个用户的进程。

在 top 命令的显示窗口中,可使用如下按键,进行交互操作:

  • ? 或 h:显示交互模式的帮助。
  • c:按照 CPU 的使用率排序,默认就是此选项。
  • M:按照内存(memory)的使用率排序。
  • N:按照 PID 排序。
  • T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序。
  • k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号。
  • r:按照 PID 给某个进程重设优先级(Nice)值。
  • q:退出 top 命令。
  • z:彩色显示
  • F:通过光标设置字段是否展示,以及展示顺序。

top命令输出内容

top 命令的输出内容是动态的,默认每隔 3 秒刷新一次。

命令的输出主要分为两部分:

  • 第一部分是前五行,显示的是整个系统的资源使用状况,我们就是通过这些输出来判断服务器的资源使用状态的。
  • 第二部分从第六行开始,显示的是系统中进程的信息。

image.png

第一部分

第一部分是前五行,显示的是整个系统的资源使用状况。

top - 22:57:49 up 10:44,  3 users,  load average: 1.00, 0.97, 0.95
Tasks: 185 total,   2 running, 183 sleeping,   0 stopped,   0 zombie
%Cpu(s): 11.8 us, 38.3 sy,  0.0 ni, 49.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1867048 total,   155412 free,   720656 used,   990980 buff/cache
KiB Swap:  4194300 total,  4174944 free,    19356 used.   909492 avail Mem 
  • 第一行为任务队列信息
  • 第二行为进程信息
  • 第三行为 CPU 信息
  • 第四行为物理内存信息
  • 第五行为交换分区(swap)信息

第一行是任务队列信息,具体内容如表所示。top - 22:57:49 up 10:44, 3 users, load average: 1.00, 0.97, 0.95

内 容说 明
22:57:49系统当前时间
up 10:44系统的运行时间
3 users当前登录了3个用户
load average: 1.00, 0.97, 0.95系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)

第二行是进程信息,具体内容如表。Tasks: 185 total, 2 running, 183 sleeping, 0 stopped, 0 zombie

内 容说 明
Tasks: 185 total系统中的进程总数
2 running正在运行的进程数
183 sleeping睡眠的进程数
0 stopped停止(暂停)的进程数
0 zombie僵尸进程数。如果不是 0,则需要手工检查僵尸进程。

第三行是 CPU 信息,具体内容如表。%Cpu(s): 11.8 us, 38.3 sy, 0.0 ni, 49.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

内 容说 明
%Cpu(s): 11.8 us用户模式占用的 CPU 百分比
38.3 sy系统模式占用的 CPU 百分比
0.0 ni改变过优先级的用户进程占用的 CPU 百分比
49.8 id空闲 CPU 占用的 CPU 百分比
0.0 wa等待输入/输出的进程占用的 CPU 百分比
0.0 hi硬中断请求服务占用的 CPU 百分比
0.0 si软中断请求服务占用的 CPU 百分比
0.0 stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

第四行是物理内存信息,具体内容如表。KiB Mem : 1867048 total, 155412 free, 720656 used, 990980 buff/cache

内 容说 明
KiB Mem : 1867048 total物理内存的总量,单位为KB
155412 free空闲的物理内存数量
720656 used已使用的物理内存数量
990980 buff/cache作为缓冲的内存数量

5)第五行是交换分区(swap)信息,具体内容如表。KiB Swap: 4194300 total, 4174944 free, 19356 used. 909492 avail Mem

内 容说 明
KiB Swap: 4194300 total交换分区(虚拟内存)的总大小,单位KB
4174944 free空闲交换分区的大小
19356 used.已使用的交换分区的大小
909492 avail Mem可用于进程下一次分配的物理内存数量

第二部分

第二部分从第六行开始,显示的是系统中进程的信息。

  • PID:进程的 ID。
  • USER:该进程所属的用户。
  • PR:优先级,数值越小优先级越高。
  • NI:优先级,数值越小、优先级越高。
  • VIRT:该进程使用的虚拟内存的大小,单位为 KB。
  • RES:该进程使用的物理内存的大小,单位为 KB。
  • SHR:共享内存大小,单位为 KB。
  • S:进程状态。
  • %CPU:该进程占用 CPU 的百分比。
  • %MEM:该进程占用内存的百分比。
  • TIME+:该进程共占用的 CPU 时间。
  • COMMAND:进程的命令名。

pgrep命令——查询进程的PID

根据特定条件查询进程的PID信息。

  • -U:指定用户
  • -l:显示进程名
  • -a:显示完整格式的进程名
  • -P (PID):显示指定进程的子进程

演示:

查询指定的用户身份运行的程序

image.png

显示进程名

image.png

当前root用户运行了多少进程

image.png

pidof查询已知程序名的pid号

用来查询已知程序名的pid号,该程序需要在运行状态。

命令格式:pidof 程序名

例如: image.png

查看bash程序下的主进程、子进程的pid号

pstree命令——以树形结构列出进程信息

命令格式:pstree  [OPTION] [ PID | USER ] 

常用选项:

  • -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
  • -p:显示PID。
  • -p < pid> : 显示指定进程及其子进程,同时显示每个进程的PID。
  • -u:显示进程的用户名称。
  • -u 用户名:显示指定用户的进程。
  • -H < pid>:高亮显示指定进程及其前辈进程。
  • -T:不显示线程thread,默认显示线程。

1.pstree PID,显示指定进程及其子进程。

image.png

2.pstree -p PID,显示指定进程及其子进程,同时显示PID。

image.png

lsof命令 —— 列举已被打开的文件

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

命令格式: lsof [选项]

选项功能
-c 字符串只列出以字符串开头的进程打开的文件。
+d 目录名列出某个目录中所有被进程调用的文件。
-u 用户名只列出某个用户的进程打开的文件。
-p pid列出某个 PID 进程打开的文件。

演示:

1.lsof -p PID显示当前进程打开的所有文件

image.png

面试题:当删除大文件为什么不释放空间(有用户在使用)

现搭建一个模拟环境,创造一个大文件 image.png

image.png

删除大文件,发现删了但不释放空间。然后输入lsof|grep delete来查看是否有用户在使用

image.png

最后发现有一个用户正在使用该文件,所以导致删除文件却无法释放空间

image.png

将该用户踢出掉就可以释放删除大文件的空间。

image.png

清缓存

image.png

vmstat 监控系统资源

如果想动态地了解一下系统资源的使用状况,以及查看当前系统中到底是哪个环节最占用系统资源,就可以使用 vmstat 命令。

vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。

命令格式:vmstat [刷新延时 刷新次数]

演示:

  • vmstat 5 2每五秒刷新一次一共刷新两次,该命令可以动态查看。 image.png

查询出的信息共分6段,下面是具体说明:

字段含义
procs进程信息字段: -r:等待运行的进程数,数量越大,系统越繁忙。 -b:不可被唤醒的进程数量,数量越大,系统越繁忙。
memory内存信息字段: -swpd:虚拟内存的使用情况,单位为 KB。 -free:空闲的内存容量,单位为 KB。 -buff:缓冲的内存容量,单位为 KB。 -cache:缓存的内存容量,单位为 KB。
swap交换分区信息字段: -si:从磁盘中交换到内存中数据的数量,单位为 KB。 -so:从内存中交换到磁盘中数据的数量,单位为 KB。 这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差。
io磁盘读/写信息字段: -bi:从块设备中读入的数据的总量,单位是块。 -bo:写到块设备的数据的总量,单位是块。这两个数越大,代表系统的 I/O 越繁忙。
system系统信息字段: -in:每秒被中断的进程次数。 -cs:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。
cpuCPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比

通过分析 vmstat 命令的执行结果,可以获得一些与当前 Linux 运行性能相关的信息。比如说:

  • r 列表示运行和等待 CPU 时间片的进程数,如果这个值长期大于系统 CPU 的个数,就说明 CPU 不足,需要增加 CPU。
  • swpd 列表示切换到内存交换区的内存数量(以 kB 为单位)。如果 swpd 的值不为 0,或者比较大,而且 si、so 的值长期为 0,那么这种情况下一般不用担心,不用影响系统性能。
  • cache 列表示缓存的内存数量,一般作为文件系统缓存,频繁访问的文件都会被缓存。如果缓存值较大,就说明缓存的文件数较多,如果此时 I/O 中 bi 比较小,就表明文件系统效率比较好。
  • 一般情况下,si(数据由硬盘调入内存)、so(数据由内存调入硬盘) 的值都为 0,如果 si、so 的值长期不为 0,则表示系统内存不足,需要增加系统内存。
  • 如果 bi+bo 的参考值为 1000 甚至超过 1000,而且 wa 值较大,则表示系统磁盘 I/O 有问题,应该考虑提高磁盘的读写性能。
  • 输出结果中,CPU 项显示了 CPU 的使用状态,其中当 us 列的值较高时,说明用户进程消耗的 CPU 时间多,如果其长期大于 50%,就需要考虑优化程序或算法;sy 列的值较高时,说明内核消耗的 CPU 资源较多。通常情况下,us+sy 的参考值为 80%,如果其值大于 80%,则表明可能存在 CPU 资源不足的情况。

总的来说,vmstat 命令的输出结果中,我们应该重点注意 procs 项中 r 列的值,以及 CPU 项中 us 列、sy 列和 id 列的值。

vmstat命令格式二

 vmstat  [选项]... 

常用选项:

选项含义
-f显示从启动到目前为止,系统复制(fork)的程序数。此信息是从 /proc/stat 中的 processes 字段中取得的。
-s将从启动到目前为止,由一些事件导致的内存变化情况列表说明。这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。
-S 单位令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。
-d列出硬盘有关读写总量的统计表。
-p 分区设备文件名查看硬盘分区的读写情况。

查看磁盘读写情况——vmstat -d,但推荐使用iostat

image.png

iostat

常用选项:

  • -c :只显示CPU行
  • -d :显示设备〈磁盘)使用状态
  • -k :以千字节为为单位显示输出
  • -t :在输出中包括时间戳
  • -x :在输出中包括扩展的磁盘指标

iostat -d功能更强大 image.png