目录
一、进程介绍
1.1 进程与线程的定义
1.1.1 进程(Process)**
1.1.2 线程(Thread)**
1.1.3 进程与线程的区别
1.2 进程的特征
1.3 进程状态
1.3.1 进程的基本状态
1.3.2 进程更多的状态
1.4 进程的优先级
1.5 进程间通信
1.6 进程的分类*
二、进程管理
2.1 查看进程命令
2.1.1 ps——查看进程静态信息
2.1.2 top——查看进程动态信息
2.1.2.1 第一部分解析
2.1.2.2 第二部分解析
2.1.2.3 htop
2.1.3 pgrep——查指定进程信息
2.1.4 pstree——查看进程树**
2.1.5 pidof——通过进程名查看PID号
2.1.6 lsof——系统管理监控、诊断工具
2.2 监控系统资源命令
2.2.1 vmstat——动态查看系统资源使用情况
2.2.2 iostat——查看每个磁盘的IO性能
2.2.3 iftop——动态查看网络流量
2.3 控制进程命令
2.3.1 启动程序
2.3.2 调整前台程序命令
2.3.3 管理后台任务命令
2.3.4 结束进程
三、计划任务
3.1 at——一次性任务
3.2 crontab——周期计划
一、进程介绍
程序:执行特定任务的一串代码,静态存放于硬盘中
1.1 进程与线程的定义
1.1.1 进程(Process)**
进程就是运行中的程序的某个实例,是有生命周期的,是资源分配的最小单位。
开启进程会消耗硬件资源,如果硬件资源消耗完,后果造成生产事故。
需要关注的五大性能:
- 内存使用率 查看命令:free -h、top
- CPU使用率 查看命令:top、ps、w、iostat、uptime
- 硬盘容量 查看命令:df
- 硬盘读写性能 查看命令:iostat、vmstat -d
- 网络带宽 查看命令:iftop
1.1.2 线程(Thread)**
线程是进程内的一个执行单元或子任务,是任务调度的基本单位,共享所属进程的资源。
1.1.3 进程与线程的区别
- 进程之间相互独立,一个程序的崩溃不会影响其他进程,而一个线程崩溃可能影响整个进程
- 进程之间需要通信共享数据,线程之间共享内存来共享数据
1.2 进程的特征
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
- 结构性:进程由程序、数据和进程控制块三部分组成。
1.3 进程状态
1.3.1 进程的基本状态
- 创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
- 就绪状态(等待):进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
1.3.2 进程更多的状态
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵尸态:zombie,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态的子进程
1.4 进程的优先级
进程优先级分为Priority(PRI) 和 Nice (NI),两者之和为一个进程的最终优先级,越小优先级越高
其中,PRI由内核动态调整,无法被用户修改 ;
NI值则可以被用户所调整,其范围为-20~19,root可以修改负数范围,普通用户只能修改0~19
临时修改NI值:
renice -n -20 2118
1.5 进程间通信
同一主机:
pipe 管道,单向传输 cmd1 | cmd 2 socket 套接字文件,双工通信 Memory-maped file 文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存 shm shared memory 共享内存 signal 信号 Lock 对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开 semaphore 信号量,一种计数器 kill 发信号
不同主机:socket=IP和端口号
RPC remote procedure call 远程调用
MQ 消息队列,生产者和消费者,如:Kafka,RabbitMQ,ActiveMQ
1.6 进程的分类*
- 守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
- 前台进程:跟终端相关,通过终端启动的进程
注意:两者可相互转化
二、进程管理
2.1 查看进程命令
2.1.1 ps——查看进程静态信息
ps命令主要用于显示包含当前运行的各进程完整信息的静态快照。
一般ps的使用场景伴随着选项,不会单独使用。
选项 | 说明 |
---|---|
a | 显示当前终端下的所有进程信息,包括其他用户的进程 |
u | 使用以用户为主的格式输出进程信息 |
x | 显示当前用户在所有终端下的进程信息 |
习惯上将上述选项组合在一起使用,如' ps aux ' 或 ' ps -elf '
执行' ps aux '命令后,将以简单列表的形式显示出进程信息。
表头 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。进程请求需要的内存大小。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。系统真实分配的内存大小。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?代表和终端无关,系统进程 |
STAT | 进程状态。常见的状态有以下几种: -D:不可被唤醒的睡眠状态,通常用于 I/O 情况。 -R:该进程正在运行。 -S:该进程处于睡眠状态,可被唤醒。 -T:停止状态,可能是在后台暂停或进程处于除错状态。 -W:内存交互状态(从 2.6 内核开始无效)。 -X:死掉的进程(应该不会出现)。 -Z:僵尸进程。进程已经中止,但是还是占用硬件资源。 -<:高优先级(以下状态在 BSD 格式中出现)。 -N:低优先级。 -L:被锁入内存。 -s:包含子进程。 -l:多线程(小写 L)。 -+:位于后台。 |
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
执行' ps -elf '后,则将以长格式显示系统中的进程信息,包括更丰富的内容。
表头 | 含义 |
---|---|
F | 进程标志,说明进程的权限,常见的标志有两个: 1:进程可以被复制,但是不能被执行;4:进程使用超级用户权限; |
S | 进程状态。具体的状态和"psaux"命令中的 STAT 状态一致; |
UID | 运行此进程的用户的 ID; |
PID | 进程的 ID; |
PPID | 父进程的 ID; |
C | 该进程的 CPU 使用率,单位是百分比; |
PRI | 进程的优先级,数值越小,该进程的优先级越高,越早被 CPU 执行;系统定义不可以人为修改 |
NI | 进程的优先级,数值越小,该进程越早被执行;可以人为修改 |
ADDR | 该进程在内存的哪个位置; |
SZ | 该进程占用多大内存; |
WCHAN | 该进程是否运行。"-"代表正在运行; |
TTY | 该进程由哪个终端产生; |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间; |
CMD | 产生此进程的命令名; |
2.1.2 top——查看进程动态信息
top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次。
选项:
-
-d 秒数:指定 top 命令每隔几秒更新。默认是 3 秒;
-
-b:使用批处理模式输出。一般和"-n"选项合用,用于把 top 命令重定向到文件中;
-
-n 次数:指定 top 命令执行的次数。一般和"-"选项合用;
-
-p 进程PID:仅查看指定 ID 的进程;
-
-s:使 top 命令在安全模式中运行,避免在交互模式中出现错误;
-
-u 用户名:只监听某个用户的进程;
在 top 命令的显示窗口中,还可以使用如下按键,进行一下交互操作:
-
? 或 h:显示交互模式的帮助;
-
c:按照 CPU 的使用率排序,默认就是此选项;
-
M:按照内存的使用率排序;
-
N:按照 PID 排序;
-
T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
-
k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
-
r:按照 PID 给某个进程重设优先级(Nice)值;
-
q:退出 top 命令;
2.1.2.1 第一部分解析
第一行为任务队列信息,具体内容如表 所示。
内 容 | 说 明 |
---|---|
16:10:03 | 系统当前时间 |
up 7:41 | 系统的运行时间,本机己经运行7小时41分钟 |
2 users | 当前登录了两个用户 |
load average: 0.00,0.01,0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 (这个平均负载完全是依据个人经验来进行判断的,一般认为不应该超过服务器 CPU 的核数) |
第二行为进程信息,具体内容如表
内 容 | 说 明 |
---|---|
Tasks: 148 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
147 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为 CPU 信息,具体内容如表
内 容 | 说 明 |
---|---|
Cpu(s): 1.3 %us | 用户模式占用的 CPU 百分比 个人用户开启的进程占用的 cpu 率 |
2.0%sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
96.7%id | 空闲 CPU 占用的 CPU 百分比 |
0.0%wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.0%si | 软中断请求服务占用的 CPU 百分比 |
0.0%st | st(steal time)意为虚拟程序占用 cpu 时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息,具体内容如表buff cache
内 容 | 说 明 |
---|---|
Mem: 1867024k total | 物理内存的总量,单位为KB |
571504k used | 己经使用的物理内存数量 |
53840k free | 空闲的物理内存数量。我们使用的是虚拟机,共分配了 628MB内存,所以只有53MB的空闲内存 |
65800k buffers | 作为缓冲的内存数量 |
缓冲(buffer)和缓存(cache)的区别:
- 缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取。
- 缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
简单来说,缓存(cache)是用来加速数据从硬盘中"读取"的,而缓冲(buffer)是用来加速数据"写入"硬盘的。
第五行为交换分区(swap)信息,如表
内 容 | 说 明 |
---|---|
Swap: 524280k total | 交换分区(虚拟内存)的总大小 |
147920 used | 已经使用的交换分区的大小 |
524280k free | 空闲交换分区的大小 |
409280k cached | 作为缓存的交换分区的大小 |
通过 top 命令的第一部分就可以判断服务器的健康状态。如果 1 分钟、5 分钟、15 分钟的平均负载高于 1,则证明系统压力较大。如果 CPU 的使用率过高或空闲率过低,则证明系统压力较大。如果物理内存的空闲内存过小,则也证明系统压力较大。
这时,我们就应该判断是什么进程占用了系统资源。如果是不必要的进程,就应该结束这些进程;如果是必需进程,那么我们该増加服务器资源(比如増加虚拟机内存),或者建立集群服务器。
2.1.2.2 第二部分解析
内容 | 说明 |
---|---|
PID | 进程的ID |
USER | 该进程所属的用户 |
PR | 优先级,数值越小优先级越高 |
NI | 优先级,数值越小、优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的CPU时间 |
COMMAND | 进程的命令名 |
2.1.2.3 htop
一种内容更丰富的动态进程信息查看工具
2.1.3 pgrep——查指定进程信息
通过pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特定进程的PID号。
` ps aux | grep "##" `与` pgrep `功能类似
格式
pgrep [选项] 表达式
选项
- -u: 指定用户
-
举例:查看zhangsan用户执行了多少进程
pgrep -u zhangsan | wc -l
- -l: 显示进程名
举例:查看所有包含‘sh’的进程名与PID
pgrep -l sh
- -a: 显示完整格式的进程名
pgrep -a "sh"
- -P pid: 显示指定进程的子进程
2.1.4 pstree——查看进程树**
pstree命令可以输出Linux系统中各种进程的树形结构,更加直观的判断出各进程之间的相互关系
格式
pstree [OPTION] [ PID | USER ]
选项
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其前辈进程
常用命令举例:
1. 查看进程号为5251的进程
pstree 5251
2. 查看用户为lisi的进程
pstree lisi
3. 显示所有进程的PID
pstree -p
2.1.5 pidof——通过进程名查看PID号
命令格式如下:
pidof [进程名]
2.1.6 lsof——系统管理监控、诊断工具
命令通式:
lsof [选项]
选项 | 功能 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件。 |
+d 目录名 | 列出某个目录中所有被进程调用的文件。 |
-u 用户名 | 只列出某个用户的进程打开的文件。 |
-p pid | 列出某个 PID 进程打开的文件。 |
-i :80 | 哪些进程打开了端口号80 |
误删文件找回
(有人使用的情况下,修复删除文件,否则无用)
1. 在~目录下创建一个文件test.txt2. 使用第二个终端打开此文件,在第一个终端删除该文件
3. 使用lsof | grep deleted 命令查看刚刚被删的文件的PID号
4. 进入/proc/PID号/fd中查看
找到3为刚刚删除的文件
5. 使用cat 3 > ~/test.txt进行文件修复
2.2 监控系统资源命令
2.2.1 vmstat——动态查看系统资源使用情况
命令格式如下:
vmstat [-a] [刷新延时 刷新次数]
vmstat 1 3
#使用vmstat检测,每个1秒刷新一次,共刷新3次
选项 | 含义 |
---|---|
-fs | -f:显示从启动到目前为止,系统复制(fork)的程序数,此信息是从 /proc/stat 中的 processes 字段中取得的。 -s:将从启动到目前为止,由一些事件导致的内存变化情况列表说明。 |
-S 单位 | 令输出的数据显示单位,例如用 K/M 取代 bytes 的容量。 |
-d | 列出硬盘有关读写总量的统计表。 |
-p 分区设备文件名 | 查看硬盘分区的读写情况。 |
字段 | 含义 |
---|---|
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:每秒进行的事件切换次数。 这两个数越大,代表系统与接口设备的通信越繁忙。 |
cpu | CPU信息字段: -us:非内核进程消耗 CPU 运算时间的百分比。 -sy:内核进程消耗 CPU 运算时间的百分比。 -id:空闲 CPU 的百分比。 -wa:等待 I/O 所消耗的 CPU 百分比。 -st:被虚拟机所盗用的 CPU 百分比 |
2.2.2 iostat——查看每个磁盘的IO性能
命令格式:
iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
常用选项:
-c 只显示CPU行
-d 显示设备〈磁盘)使用状态
-k 以千字节为为单位显示输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
2.2.3 iftop——动态查看网络流量
2.3 控制进程命令
2.3.1 启动程序
- 前台启动:通过终端启动,且启动后一直占据终端
- 后台启动:可通过终端启动,但启动后即转入后台运行(释放终端)
2.3.2 调整前台程序命令
- 将未启动的前台命令运行于后台
command & #在前台命令后加上&
- 将已经运行的前台命令停止并挂在后台
ping 127.0.0.1 #运行前台命令 ... ... ... ctrl+z #在运行时,按ctrl+z
2.3.3 管理后台任务命令
- jobs——查看后台任务列表
jobs
- fg——调出后台任务
fg [序号]
- bg——继续后台任务
bg [序号]
2.3.4 结束进程
kill [信号] PID
注意:kill 命令是按照 PID 来确定进程的,所以 kill 命令只能识别 PID,而不能识别进程名。Linux 定义了几十种不同类型的信号,读者可以使用 kill -l 命令查看所有信号及其编号,这里仅列出几个常用的信号。
信号编号 | 信号名 | 含义 |
---|---|---|
0 | EXIT | 程序退出时收到该信息。 |
1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
3 | QUIT | 退出。 |
9 | KILL | 杀死进程,即强制结束进程。 |
11 | SEGV | 段错误。 |
15 | TERM | 正常结束进程,是 kill 命令的默认信号。 |
三、计划任务
3.1 at——一次性任务
at [选项] [时间]([HH:MM]、[yyyy-mm-dd])
at 15:00 2024-04-17
at> cmd #编写命令
#ctrl+d提交
atq
9 2013-07-26 02:00 a root
#说明root用户有一个at任务在2013年7月26日02:00执行,工作号是9
格式 | 用法 |
---|---|
HH:MM | 比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。 |
Midnight(midnight) | 代表 12:00 AM(也就是 00:00)。 |
Noon(noon) | 代表 12:00 PM(相当于 12:00)。 |
Teatime(teatime)下午茶 | 代表 4:00 PM(相当于 16:00)。 |
英文月名 日期 年份 | 比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。 |
MMDDYY、MM/DD/YY、MM.DD.YY | 比如 011518 表示 2018 年 1 月 15 号。 |
now+时间 | 以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示命令在 5 天之后的此时此刻执行。 |
3.2 crontab——周期计划
crontab [项目] [file]
选项 | 功能 |
---|---|
-u user | 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
-e | 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。 |
-l | 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。 |
-r | 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。 |
-i | 在删除用户的 crontab 文件时,给确认提示。 |
crontab -e #进入crontab编辑界面,退出和vim编辑器一样
* * * * * 需要执行任务的命令
项目 | 含义 | 范围 |
---|---|---|
第一个"*" | 一小时当中的第几分钟(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 分钟就执行一次命令。 |
在书写 crontab 定时任务时,需要注意以下几个事项:
- 5个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
使用演示:
1. 查看/etc/crontab文件来查看配置信息,且编写执行命令
PATH表示编写命令时,可以使用哪些相对路径下的命令,若命令不在PATH中需要输入绝对路径。
2. 编写完后,查看crontab中的执行任务,并且观察是否执行成功