进程与计划任务管理

57 阅读23分钟

55ec188d3635445bfa288e539e300dd.jpg

一、什么是程序?

  • 文件中静态保存的代码

  • 是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。

  • 用于描述进程要完成的功能,是控制进程执行的指令集。

  • 保存在硬盘、光盘等介质中的可执行代码和数据。

二、什么是进程

  • 运行的程序在内存中的叫进程

  • 电脑用pid来识别进程;程序运行,系统自动分配pid

  • 存在生命周期

  • 都由其父进程创建

三、进程具有的特征

12104f9ce6fdd98027101ec44cee72e.png

  • 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;

  • 并发性:任何进程都可以同其他进程一起并发执行;

  • 独立性:进程是系统进行资源分配和调度的一个独立单位;

  • 结构性:进程由程序、数据和进程控制块三部分组成。

四、进程的基本状态

85701a046b9ed093e4afbf22ec75627.png

  • 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态;

  • 就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行;

  • 执行状态:进程处于就绪状态被调度后,进程进入执行状态;

  • 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用;

  • 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行。

五、进程的状态

  • 运行态:running

  • 就绪态:ready

  • 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable;

  • 停止态:stopped,暂停于内存,但不会被调度,除非手动启动;

  • 僵尸态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵尸态 的子进程。

六、什么是线程

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。因此在80年代,出现了能独立运行的基本单位——线程(Threads)。

查看进程有几个线程,可以使用 "cat /proc/PID/status"查看。

七、进程和线程的区别

  • 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

  • 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

  • 调度和切换:线程上下文切换比进程上下文切换要快得多;

  • 程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;

  • 同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的;

  • 一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。

八、僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源。

在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由init 来接管他,成为他的父进程。

示例

image.png

image.png

九、查看进程信息

1.ps命令:查看静态进程统计信息

ps 命令是 Process Status 的缩写 ,可以查看进程当前状态的快照。查看静态的进程统计信息,即执行 ps 命令的那个时刻的进程快照。默认显示当前终端中的进程,Linux系统各进程的相关信息均保存在/proc/PID 目录下的各文件中。

常用选项

  • a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将示系统中所有的进程信息。

  • u:使用以用户为主的格式输出进程信息。

  • x:显示当前用户在所有终端下的进程信息。

  • -e:显示系统内的所有进程信息。

  • -l:使用长(Long)格式显示进程信息。

  • -f:使用完整的(Full)格式显示进程信息。

  • k|--sort 属性:对属性排序,属性前加 - 表示降序排列。

ps命令支持三种语法格式

  • UNIX风格。选项可以组合在一起,并且选项前必须有 "-" 连字符 。如:ps -ef。

  • GNU选项。选项前有两个 "-" 连字符 。如:ps --help。

  • BSD选项。选项可以组合在一起,但是选项前不能有 "-" 连字符。如:ps aux。

我们常用的是BSD选项,这个一般看个人选择。

查看静态进程统计信息命令:ps aux

  • a:显示终端上的所有进程,包括其它用户的进程

  • u:表示列出进程的用户名

  • x:显示所有终端的进程

示例

image.png

进程信息共有11个字段,每个字段含义如下:

表头(列名)含义重点
USER进程的用户
PID进程的id号
%CPU进程占用CPU百分比*
%MEM进程占用内存百分比*
VSZ该进程使用的虚拟内存量(KB)
RSS该进程占用的物理内存量(KB)
TTY启动进程终端名
STAT该进程的状态*
START该进程启动时间
TIME该进程实际使用CPU运行的时间
COMMAND进程启用的命令

STAT进程的状态:

  • D:不可中断休眠状态

  • S:处于休眠状态,可被唤醒

  • R:正在运行状态

  • T:停止状态,可能是在后台暂停或进程处于跟踪调试状态

  • Z:僵尸进程,进程已经终止,但部分程序还在内存当中

查看静态进程统计信息命令:ps -elf

  • -e:显示系统内的所有进程信息

  • -l:使用长格式显示进程信息

  • -f:使用完整的格式显示进程信息

示例:

image.png

进程信息共有14个字段,每个字段含义如下:

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

如果不想看到所有的进程,只想查看一下当前登录的终端产生了哪些进程,那只需使用 "ps -l" 命令就足够了。

自定义显示字段(查看进程的特定属性)

1)ps axo 列名,列名,列名,列名

image.png

1)ps -eo 列名,列名,列名,列名

image.png

进程排序

1)按CPU占比升序排列:ps aux --sort=%cpu。

image.png

2)按内存占比降序排列:ps aux --sort=-%mem。

image.png

特殊示例:找到未知进程的执行程序文件路径

准备:未知进程的执行程序文件

image.png

1.查找静态进程信息,CPU倒序,只显示前十行。

image.png

2.通过PID号,切换到未知进程所在的文件夹

image.png

3.找到exe文件夹,未知进程的绝对路径就在其中。

image.png

4.确定未知进程的执行程序文件路径是否有用,若无用,则删除未知进程的执行程序文件路径,并在相同路径下建立一个相同名称的文件。(这也是预防电脑病毒的方法)

注意: 查看指定进程信息用prtstat命令

prtstat命令格式:prtstat [-r] PID

2.top命令:查看动态进程统计信息

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

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

image.png

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

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

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

top命令输出内容——第一部分详解

image.png

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

1)第一行是任务队列信息:top - 15:21:57 up 1:20, 2 users, load average: 0.03, 0.02, 0.05

  • 15:21:57:系统当前时间

  • up 1:20:系统的运行时间。本机己经运行了一个小时20分钟

  • 2 users:当前登录了两个用户

  • load average: 0.03, 0.02, 0.05:系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数)。

2)第二行是进程信息:Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie

  • 152 total:系统中的进程总数

  • 1 running:正在运行的进程数

  • 151 sleeping:睡眠的进程数

  • 0 stopped:停止(暂停)的进程数

  • 0 zombie:僵尸进程数。如果不是 0,则需要手工检查僵尸进程。

3)第三行是 CPU 信息:%Cpu(s): 0.2 us,0.0 sy,0.0 ni,99.8 id,0.0 wa,0.0 hi, 0.0 si, 0.0 st

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

4)第四行是物理内存信息:KiB Mem :1867048 total,1154048 free,299880 used,413120 buff/cache

  • 1867024 total : 物理内存的总量,单位为KB

  • 1243576 free:空闲的物理内存数量

  • 255592 used:已使用的物理内存数量

  • 367856 buff/cache:作为缓冲的内存数量

5)第五行是交换分区(swap)信息:KiB Swap: 3907580 total, 3907580 free, 0 used. 1363728 avail Mem

  • 3907580 total:交换分区(虚拟内存)的总大小,单位KB

  • 3907580 free:空闲交换分区的大小

  • 0 used.:已使用的交换分区的大小

  • 1363728 avail Mem:可用于进程下一次分配的物理内存数量

top命令输出内容——第二部分详解

image.png

top 命令的第二部分输出,主要是系统进程信息,各个字段的含义如下:

表头(字段名)说明
PID进程的 ID号
USER该进程所属的用户
PRpriority优先级,数值越小 优先级越高
NInice优先级,数值越小 优先级越高
VIRT该进程使用的虚拟内存的大小,单位为 KB
RES该进程使用的物理内存的大小,单位为 KB
SHR共享内存大小,单位为 KB
S进程状态
%CPU该进程占用 CPU 的百分比
%MEM该进程占用内存的百分比
TIME+该进程总共占用的 CPU 时间
COMMAND进程的命令名(进程文件、进程名称)

tty终端

  • Centos7系统,tty1表示图形界面,tty2-tty6表示文字界面,可以用Ctrl+Alt+F1-F6切换;

  • pts说明是用远程工具连接的,比如xshell,后面的数字代表登录的时间顺序,越小证明登录的越早;

  • 查看线程 top -H;ps -T。

常用命令

命令说明
P以占据的CPU百分比,%CPU
M占据内存百分比,%MEM
T累积占据CPU时长,TIME+
luptime信息
ttasks及cpu信息
mmemory信息
q退出命令
s修改刷新时间间隔
k终止指定进程
W保存文件
1(数字)cpu分别显示

3.pgrep命令:查询进程的PID

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

  • -U:指定用户

  • -l:显示进程名

  • -a:显示完整格式的进程名

  • -P < PID>:显示指定进程的子进程

示例

1)查询指定用户

image.png

2)显示进程名

image.png

3)显示完整格式的进程名

image.png

注意:已知程序名不知道pid号的情况下,可以用pidof命令查找pid号。

4.pstree命令:进程命令树

pstree命令格式:pstree [选项] PID 用户名

常用选项: -a:显示启动每个进程对应的完整指令,包括启动进程的路径、参数等;

-p:显示PID;

-T:不显示线程thread,默认显示线程;

-u:显示用户切换;

-H:pid 高亮显示指定进程及其前辈进程。

image.png

5.lsof命令:列举被系统打开的文件

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

**lsof命令格式:**lsof [选项]

常用选项

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

示例

1)查询打开/bin/bash文件的所有进程

image.png

2)查询pid号为705进程打开的所有文件

image.png

3)查询nobody用户打开的所有文件

image.png

6.vmstat命令:监控系统资源

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

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

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 分区设备文件名查看硬盘分区的读写情况。

示例

image.png

image.png

十、启动进程

1.手工启动

  • 前台启动:用户输入命令,直接执行程序

  • 后台启动:在命令行尾加入"&"符号

2.调度启动

  • 使用at 命令,设置一次性计划任务

  • 使用crontab命令,设置周期性计划任务

3.进程的前后台调度

  • ctrl+z组合键:将当前进程挂起,即调入后台并停止执行。

  • jobs 命令:查看后台任务列表

  • bg 命令:继续运行后台命令

  • fg 命令:将后台程序调回前台

示例

image.png

十一、结束进程

1.kill命令

kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。

也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。

kill命令格式:kill [信号] PID

常用信号

信号编号信号名含义
0EXIT程序退出时收到该信息。
1HUP挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。
2INT表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。
3QUIT退出。键盘退出使用 "Ctrl+\ "。
9KILL杀死进程,即强制结束进程。
11SEGV段错误。
15TERM正常结束进程,是 kill 命令的默认信号。
18CONT继续。
19STOP暂停。

示例

image.png

2.killall命令

killall 也是用于关闭进程的一个命令,但和 kill 不同的是,killall 命令不再依靠 PID 来杀死单个进程,而是通过程序的进程名来杀死一类进程,也正是由于这一点,该命令常与 ps、pstree 等命令配合使用。

killall命令格式:killall [选项] [信号] 进程名

常用选项

  • -i:交互式,询问是否要杀死某个进程。

  • -I:忽略进程名的大小写。

3.pkill命令

根据特定条件终止相应的进程

常用命令选项

  • -U:根据进程所属的用户名终止相应进程
  • -t:根据进程所在的终端终止相应进程

十二、计划任务管理

1.at命令:一次性任务设置

at [HH:MM] [yyyy-mm-dd]:设置一次性任务,按ctrl+d 提交任务。

atq :查看at任务。

atrm:删除at任务。

2.crontab命令:周期性任务设置

crontab命令简介

  • 按照预先设置的时间周期(分钟、小时、天......)重复执行用户指定的命令操作。

  • 属于周期性计划任务。

主要设置文件

全局配置文件,位于文件:/etc/crontab

系统默认的设置,位于目录:/etc/cron.*/

用户定义的设置,位于文件:/var/spool/cron/用户名

查看/etc/crontab文件

image.png

crontab任务配置的格式

  • crontab -e [-u 用户名]     //编辑计划任务  

  • crontab -l [-u 用户名]     //查看计划任务

  • crontab -r [-u 用户名]     //删除计划任务  

注意

-u选项缺省时默认针对当前用户,只有超级用户才可以使用-u。

使用 "crontab -e" 进入 crontab 编辑界面。会打开vim编辑你的任务,输入格式为:

 * * * * * 需要执行的任务

 #即:时间周期设置 任务内容设置。
 #任务内容设置中,命令一定要用绝对路径,例如cp命令,要用/usr/bin/cp,可以用which查看命令的绝对路径

每个星号(*)表示不同的时间概念

项目含义范围
第一个"*"一小时当中的第几分钟(minute)0~59
第二个"*"一天当中的第几小时(hour)0~23
第三个"*"一个月当中的第几天(day)1~31
第四个"*"一年当中的第几个月(month)1~12
第五个"*"一周当中的星期几(week)0~7(0和7都代表星期日)

时间数值的特殊表示方法

特殊符号含义
*(星号)代表任何时间。比如第一个"*"就代表一小时中每分钟都执行一次的意思。
,(逗号)代表多个不连续的时间点。比如 "0 8,12,16 * * * 命令" 就代表在每天的 8 点 0 分、12 点 0 分、16 点 0 分都执行一次命令。
-(中杠)代表连续的时间范围。比如"0 5 * * 1-6 命令",代表在周一到周六的凌晨 5 点 0 分执行命令。
/(正斜线)代表每隔多久执行一次(即间隔的时间频率)。比如"*/10命令",代表每隔 10 分钟就执行一次命令。

示例

  • 0 17 * * 1-5:周一到周五每天17:00  

  • 30 8 * * 1,3,5:每周一、三、五的8:30

  • 08-18/2 * * *   :8点到18点之间每2小时  

  • 0 * */3 * *:每3天的每个整点

十三、总结

1.查看进程命令

静态查看:ps aux,ps -elf

动态查看:top

查看进程PID:pgrep

以树形结构列出:pstree

列举被系统打开的文件:lsof

监控系统资源:vmstat

发现僵尸进程(状态为Z)一定要杀掉。

“cat /proc/PID/status" 可以查看指定进程具体有几个线程。

2.控制进程

  • 后台启动

命令行尾加”&“符号。

  • 前后台调度

ctrl+z 挂起当前进程,

jobs查看任务列表

fg 序号,将前台进程调到后台运行。

bg 序号,将后台暂停的进程恢复执行状态。

  • 终止进程

kill [信号] PID

killall 进程名

pkill [信号] [-U 用户名]

pkill [信号] [-t 终端名]

3.计划任务管理

  • at一次性任务设置

at [HH:MM] [yyyy-mm-dd]:设置一次性任务,按ctrl+d 提交任务。

atq :查看at任务。

atrm:删除at任务。

  • crontab周期性任务设置

crontab -e:编辑计划任务。

crontab -l:查看计划任务。

时间格式:分、时、日、月、周几。 可以查看cat /etc/crontab 文件。

*表示任意。

,表示多个不连续的时间点。

-表示连续的时间范围。

/表示频率。

命令要使用绝对路径。

6个选项(时间+任务)都不能为空,必须填写。

4.进程的五大性能

内存使用率:free

cpu使用率:ps,top,w,iostat

硬盘使用率:df

硬盘读写性能:dd,iostat

网络带宽:iftop