1. 系统见识和进程控制工具
1.1 top 命令
top 命令时 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 win 中的任务管理器,默认 5 s 刷新一次结果。
代码被 cpu 调用运行的过程 —— 进程
杀死进程:释放 cpu、内存的过程
僵尸进程:即父进程被杀死,子进程没有被杀死,没有占用 CPU,但占用内存
父进程可以生成一堆子进程,杀死父进程,子进程会被回收
(父进程)bash - (子进程)bash
00. 第一行为任务队列信息
12:38:33 | 当前时间 |
---|---|
up 50days | 系统运行时间,格式为 时:分 |
1 user | 当前登录用户数 |
load average:0.06,0.60,0.48 | 系统负载,三个数值分别为 1 分钟,5分钟,15分钟前到现在的平均值 |
01. 第二、三行为进程和 CPU 的信息
Tasks:29 total | 进程总数 |
---|---|
1 running | 正在运行的进程数 |
28 sleeping | 睡眠的进程数,不占 cpu |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
cpu(s):0.3% us | 用户空间占用 cpu 百分比 |
1.0% sy | 内核空间占用 cpu 百分比 |
0.0% ni | 用户进程空间内改变过优先级的进程占用 cpu 百分比 |
98.7% id | 空闲 cpu 百分比 |
0.0% wa(wait) | 等待输入输出的 cpu 时间百分比 |
0.0% hi | 硬件中断占用 cpu 时间的百分比 |
0.0% si | 软件中断占用 cpu 时间的百分比 |
0.0% st | 被偷走的 cpu 占用百分比(如虚拟机使用物理机的内存,大于 0 表示运行虚拟机) |
02. 第四、五行为内存信息:
Mem: 2050284k total, 552424k used, 1497860k free, 25576k buffers(缓冲区) # 内存
Swap: 4095996k total, 0k used, 4095996k free, 186724k cached (缓存) # 交换分区
内存中有一块单独的空间 buffer,叫缓冲区,从硬盘中加载到内存,先加载到 buffer
cache 是高速缓存区,为了解决 cpu 与内存的速度差,存在于内存中,将 cpu 经常要用访问的数据放在 cache中,避免了频繁加载同一类型数据。
03. 进程信息:
列名 | 含义 | 列名 | 含义 |
---|---|---|---|
PID | 进程 id | TIME | 进程使用的 cpu 时间总计,单位秒 |
PPID | 父进程 id | TIME+ | 进程使用的 cpu 时间总计,单位 1/1000秒 |
RUSER | real user name | %MEM | 进程使用的物理内存百分比 |
UID | 进程所有者的用户 id | VIRT | 进程使用的虚拟内存总量,单位 kb,VIRT=SWAP+RES |
USER | 进程所有者的用户名 | SWAP | 进程使用的虚拟内存中,被换出的大小,单位 kb |
GROUP | 进程所有者的组名 | RES | 进程使用的、未被换出的物理内存大小,单位 kb, RES=CODE+DATA |
TTY | 启动进程的终端名,不是从终端启动的进程为 ? | CODE | 可执行代码占用的物理内存大小,单位 kb |
PR | 优先级 | DATA | 可执行代码一位的步伐(数据段+栈)占用的物理内存大小,单位 kb |
NI | nice 值,负值表示高优先级,正直表示低优先级 | SHR | 共享内存大小,单位 kb |
P | 最后使用的 cpu,仅在多 cpu 环境下有意义 | nFLT | 页面错误次数 |
%CPU | 上次更新到现在的 cpu 时间占用百分比 | nDRT | 最后一次写入到现在,被修改的页面数 |
s | 进程状态:D = 不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程 | COMMAND | 命令名/命令行 |
WCHAN | 若该进程睡眠,则显示睡眠中的系统函数名 | Flags | 任务表示,展开 sched.h |
1.2 free 命令
查看内存的使用状态
free
echo 'scale=2;1906280/1024/1024' | bc -l # 内存换算(scale=2 保留2位)
free -m # 以 M 为单位
free -h # 以 G 为单位
[root@hj ~]# free
1 2 3 4 5 6
total used free shared buffers cached
1 Mem: 2050284 552720 1497564 3172 26712 186776
2 -/+ buffers/cache: 339232 1711052
3 Swap: 4095996 0 4095996
- total:总计、used:使用、free:剩余、shared:共享
- 内存使用的就是 buffer 和 cache
- 其中 f(1)(1) = 2050284 kb ,为内存总大小,f(1)(1) + f(1)(2)
- f(1)(2) = 552720 kb,为总共分配出去的 buffer 和 cache,f(1)(2) = f(1)(5) + f(1)(6) + f(2)(2) = 26712 + 186776 + 339232
- f(1)(5)、f(1)(6) 26712 kb、 186776 kb,为还没有用的 buffer 和cache
- f(2)(2) = 339232 kb,为被使用的 buffer 和 cache,那么内存使用率 = f(2)(2) / f(1)(1) = 339232 / 2050284(
echo 'scale=2;339232/2050284 | bc -l'
) - f(2)(3) = 1711052 kb,为内存的真实剩余量,f(2)(3) = f(1)(5) + f(1)(6) + f(1)(3) = 26712 + 186776 + 1497564
2. 进程监控
进程是程序的一次动态进行
守护进程是在后台运行并提供系统服务的一些进程
父进程、子进程:当一个进程创建另一个进程时,第 1 个进程被称为新进程的父进程,而新进程被称为子进程
2.1 ps 命令
ps(process search)命令用于查看当前进程的状态
ps
ps aux # 详细查看,all、user_id、x 在哪个终端
ps aux | head -2 # 查看第一行,每行就是一个进程、TTY表示在哪个终端运行,?表示在后台不在任何终端
一般显示出的进程很多,要想精确找到想要的进程,可以与 grep 命令搭配使用
ps aux | grep 'init' # 找到进程中包含 init 字符的进程
ps aux | grep 'init' | grep -v 'grep' # 过滤掉包含 grep 的行,grep -v 反向匹配
ls /test | grep 'txt' # 过滤包含 txt 的文件
grep 'root' /etc/passwd # 过滤,包含 root 的行
2.2 pgrep 命令
除了可以利用管道符搭配 grep 命令过滤查看进程的 PID 外,还可以使用 pgrep 命令,它可以用于查询正在运行的进程的 PID 信息等。
语法:
pgrep [选项] '进程名'
选项:
- -l:同时显示进程名和 PID
- -o:当匹配多个进程时,显示进程号最小的那个
- -n:当匹配多个进程时,显示进程号最大的那个
查看终端、火狐浏览器的 PID:
pgrep -l 'bash'
pgrep -l 'firefox'
2.2 kill 命令
杀死进程,要想杀死一个进程,需要先找到进程的 PID(精确),或进程名(不精确),kill 实际上是发信号,要 cpu 挂起进程。
kill -9 PID # 强制杀死
杀死终端:
ps asx | grep 'bash' | grep -v 'grep' # 找到终端的 PID
kill -9 PID # 强制杀死终端 (精确)
杀死 Firefox
ps -asx | grep 'firefox' | grep -v 'grep'
kill PID # 杀死火狐
firefox & # 运行在后台
jobs # 查看后台运行的程序
fg %1 # 将后台调到前台运行,其中 1 为 工作号
bg %1 # 直接在后台运行
pstree # 进程树
pkill -9 'bash' # 按照进程名杀(全杀)