1.1 进程概述
通俗的讲程序是一个包含可以执行代码的静态的文件。进程是一个开始执行但是还没有结束的程序的实例。
当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。
1.2 进程的分类
按照进程的功能和运行的程序分类,进程可划分为两大类:
-
系统进程
可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
-
用户进程
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
针对用户进程,又可以分为如下3类:
- **交互进程:**由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。
- **批处理进程:**该进程是一个进程集合,负责按顺序启动其他的进程。
- **守护进程:**守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。
1.3 ps 命令
ps命令用于列出执行ps命令的那个时刻的进程快照,就像用手机给进程照了一张照片。
1.3.1 常用参数
参数 | 作用 |
---|---|
-e | 显示所有进程 |
-f | 额外显示UID、PPID、C与STIME栏位 |
a | 显示与终端相关的所有进程,包含每个进程的完整路径 |
u | 显示进程的用户信息 |
x | 显示与终端无关的所有进程 |
-u | 显示指定用户相关的进程信息 |
1.3.2 使用实例
1)简易查看进程
# ps -ef
输出信息中各列的说明如下:
结果列 | 含义 |
---|---|
UID | 进程被该UID所拥有,程序运行必须要有用户,一般是虚拟用户 |
PID | 进程的标识号;Process ID |
PPID | 进程的父进程的标识号; |
C | CPU使用的资源百分比; |
STIME | 进程开始的时间; |
TTY | 该进程是在哪个终端机上面运作,若与终端机无关,则显示? |
TIME | 进程所使用的总的CPU时间; |
CMD | 正在执行的命令行; |
2)使用BSD语法格式显示每个进程信息
# BSD格式参数,使用a选项和x选项显示所有进程,使用u选项显示进程的用户信息
ps aux
输出信息中各列的说明如下:
结果列 | 含义 |
---|---|
USER | 该进程属于的用户; |
PID | 该进程的进程号; |
%CPU | 该进程使用掉的CPU资源百分比; |
%MEM | 该进程所占用的物理内存百分比; |
VSZ | (Virtual Size)进程占用的虚拟内存量 (单位Kb); |
RSS | 该进程占用的物理内存大小 (单位Kb); |
TTY | 该进程是在哪个终端机上面运作的,若与终端机无关,则显示? |
STAT | 该进程目前的状态 |
START | 该进程被触发启动的时间; |
TIME | 该进程实际使用 CPU 运作的时间; |
COMMAND | 该进程的实际命令,[ 方括号 ] 属于内核态的进程。 没有 [ ] 的是用户态进程。。 |
**STAT:**该进程目前的状态介绍
状态 | 含义 |
---|---|
R | 正在运行,或者是可被运行。 |
S | 正在中断睡眠中,可被某些信号(signal) 唤醒。 |
D | 不可中断睡眠。 |
T | 正在侦测或者是停止了。 |
Z | 已经终止,但是其父进程无法正常终止他,造成 zombie (疆尸) 进程的状态。 |
+ | 前台进程。 |
l | 多线程进程。 |
N | 低优先级进程。 |
< | 高优先级进程。 |
s | 进程领导者。 |
L | 已将页面锁定到内存中。 |
1.4 pstree 命令
以树形结构显示进程和进程之间的关系
1)常用参数
参数 | 作用 |
---|---|
-a | 显示每个进程对应的完整指令 |
-c | 显示的进程中包含子进程和父进程 |
-h | 对现在执行的程序进行特别标注 |
-n | 根据进程PID号来排序输出 |
-p | 显示进程的PID |
-u | 显示进程对应的用户名称 |
2)使用实例
# pstree
1.5 pgrep 命令
基于给定条件来查找正在运行的程序的进程 ID。它可以是进程名字的全称或者一部分,进程运行者,或者其他属性。
1)常用参数
参数 | 作用 |
---|---|
-u | 显示指定用户的所有进程号 |
2)使用实例
# 查看指定程序的进程ID
pgrep ssh
# 查看用户的所有进程号
pgrep -u root
1.6 top 命令
1.6.1 常用参数
参数选项 | 解释说明(带※的为重点) |
---|---|
-a | 将进程按照使用内存排序 |
-b | 以批处理模式显示进程信息,输出结果可以传递给其他程序或写入到文件中。 |
-c | 显示进程的整个命令路径,而不是只显示命令名称 |
-d | 指定每两次屏幕信息刷新之间的时间间隔(top -d 1) |
-H | 指定这个可以显示每个线程的情况,否则就是进程的总的状态 |
-i | 不显示闲置或者僵死的进程信息 |
-n | top输出信息更新的次数,完成后将退出top命令 |
-p | 显示指定的进程信息(top -p 进程号) |
1.6.2 快捷键指令
快捷键 | 作用 |
---|---|
1 | 查看系统核心总数, 类似于 lscpu(CPUs) |
q | 退出top |
M | 按内存使用百分比排序输出 |
P | 按CPU使用百分比排序输出 |
R | 对已排序的列反转排序 |
x | 高亮显示排序的列 |
z | 以彩色信息展示 |
b | 高亮显示处于R状态的进程 |
>或< | 改变排序的列,依然高亮显示。 |
h | 查看帮助 |
l,t,m | 显示/隐藏前5行的数据输出 |
1.6.3 top输出
1)第一行:任务队列信息,同uptime命令的执行结果
队列信息 | 含义 |
---|---|
04:17:40 | 当前系统时间 |
up 3:06 | 系统已经运行了多久 |
1 user | 当前有几个用户登录系统 |
load average: 0.00, 0.01, 0.05 | 平均负载情况 |
2)第二行:Tasks为任务(进程)
从上面的信息可以看出,系统现在共有106个进程,其中处于运行状态的有1个,105个在休眠(sleep),stoped状态0个,zombie状态(僵死)的有0个。
3)第三行:%Cpu(s)为CPU状态信息
队列信息 | 含义 |
---|---|
0.0% us | (user)用户空间占用CPU的百分比(如:应用程序、执行命令) |
0.3% sy | (system)内核空间占用CPU的百分比(如:内核进程、硬件磁盘操作) |
0.0% ni | (nice)改变过优先级的进程占用CPU的百分比 |
99.7% id | (idle)空闲CPU百分比,数值越大,CPU越空闲 |
0.0% wa | (wait)IO等待占用CPU的百分比 |
0.0% hi | (hard Interrupts)硬中断(Hardware IRQ)占用CPU的百分比。 |
0.0% si | 软中断(Software Interrupts)占用CPU的百分比 |
0.0% st | 虚拟机占用CPU的百分比 |
4)第四行:KiB Mem为内存状态
队列信息 | 含义 |
---|---|
2027864 total | 内存一共多大 |
1121740 free | 可用内存,剩余内存 |
571848 used | 已经使用的内存 |
334276 buff/cache | 系统缓存和缓冲占用内存空间 |
5)第五行:KiB Swap为swap交换分区信息
队列信息 | 含义 |
---|---|
2097148 total | 交换区总量 |
2097148 free | 空闲交换区总量 |
0 used | 使用的交换区总量 |
1296988 avail Mem | 可用内存大小 |
6)从第七行开始,给出的是各进程(任务)的状态监控
状态 | 含义 |
---|---|
PID | 进程id |
USER | 进程所有者 |
PR | 进程优先级 |
NI | nice值,负值表示高优先级,正值表示低优先级 |
VIRT | 进程使用的虚拟内存总量,单位kb |
RES | 进程使用的、未被换出的物理内存大小,单位kb |
SHR | 共享内存大小,单位kb |
S | 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程。 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 进程名称(命令名/命令行) |
1.7 进程三杀手
- **kill:**通过发送信号,通过PID杀掉进程
- **killall:**通过进程名字
- **pkill:**通过进程名称(完整名称)
1.7.1 kill 终止你希望停止的进程
1)常用参数
参数 | 作用 |
---|---|
-l | 列出全部的信号名称 |
-s | 指定要发送的信号 |
2)什么是信号?
kill命令发给操作系统,让操作系统去执行的一个指令
# 查看全部信号
kill -l
常见信号列表:
数字信号 | 信号别名 | 作用 |
---|---|---|
1 | HUP | 挂起信号 往往可以让进程重新配置,重新加载 |
2 | INT | 中断信号,起到结束进程的作用,和ctrl+c的作用一样 |
3 | QUIT | 让进程退出,结果是进程退出 |
9 | KILL | 直接结束进程,不能被进程捕获(强制杀死,慎用) |
15 | TERM | 进程终止,这是默认信号 |
18 | CONT | 被暂停的进程将继续恢复运行 |
19 | STOP | 暂停进程 |
20 | TSTP | 用户停止请求,作用类似于ctrl+z 把进程放到后台并暂停 #后台挂起 |
3)使用实例
# 默认不加参数关闭vsftpd
pgrep vsftpd
kill 66822
pgrep vsftpd
# kill杀不死的时候
# 可以用kill -9 进程名 #强制杀
kill -9 `pgrep vsftpd`
pgrep vsftpd
生产经验:
- 强制杀,导致服务起不来。一般不要操作,宁愿等一会。
- 数据服务不能强杀, mysql,oracle,mongodb(数据库里,磁盘上有自己的文件系统),千万别强杀。
- 非数据服务可以强杀,nginx,vsftpd(数据在磁盘上)
1.7.2 killall 通过进程名字
使用方式
killall 进程名
# 连着执行直到看到后面提示no process found
killall nginx
killall nginx
1.7.3 pkill 通过进程名称(完整名称)
1)常用参数
参数 | 作用 |
---|---|
-t | 杀死指定终端进程 |
-u | 杀死指定用户的进程 |
2)使用实例
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
0
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
1
[root@oldboy ~]# pkill vsftpd #杀进程名
[root@oldboy ~]# pgrep vsftpd &>/dev/null&&echo 1||echo 0
0
[root@oldboy ~]# ps -ef|grep vsftp
root 79996 1645 0 23:46 pts/0 00:00:00 grep --color=auto vsftp
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep|wc -l
0
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep|wc -l
1
[root@oldboy ~]# ps -ef|grep vsftp|grep -v grep
root 80008 1 0 23:46 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
# -u 指定用户
pkill -u oldboy crond
# -t 杀死指定终端进程
pkill -t pts/1