Linux 进程管理命令 新手超详细教程
这个单独拿出来写一下,之前的文章有提到,但不详细;
在学习命令之前,我们先把最核心的概念讲透,避免死记硬背。
程序:是存放在硬盘上的静态文件(比如 /bin/ls、/usr/bin/bash),占磁盘空间,不消耗系统资源。 进程:是运行起来的程序,是程序的「运行实例」。它会占用内存、CPU 时间,有自己的生命周期,系统会给每个进程分配一个唯一的数字编号,叫 PID(进程 ID)。
Linux 是多任务操作系统,同一时间会有几十上百个进程在运行,进程管理就是:查看进程状态、监控资源占用、控制进程启停、调整运行优先级。
下面按「查看 → 监控 → 控制 → 进阶」的顺序讲解,每个命令都配逐成分拆解 + 真实输出解读 + 新手避坑提醒。
一、基础必知:进程的核心属性
每个进程都有几个固定的关键属性,所有命令都是围绕这些属性展开的:
表格
| | |
|---|
| | 唯一数字编号,从 1 开始,1 号进程是系统初始化进程(systemd) |
| | 创建这个进程的进程的 PID,所有进程的最终父进程都是 1 号进程 |
| | |
| | |
| | |
| | |
二、查看进程状态:静态快照类命令
这类命令会输出执行瞬间的进程状态,相当于给进程拍一张照片。
1. ps:最经典的进程查看命令
ps 是 Process Status 的缩写,是使用频率最高的进程查看命令,选项非常多,新手记住两组经典组合即可。
组合一:ps aux —— BSD 风格,查看所有进程详细信息
这是最常用的写法,能看到 CPU、内存占用等完整信息。
举例执行与输出逐列解读
典型输出(只取前几行):
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.2 16864 9244 ? Ss 10:00 0:01 /sbin/initroot 123 0.1 1.2 125600 48768 ? S<sl 10:00 0:20 /usr/lib/systemd/systemd-journaldzhangsan 456 0.0 0.3 8232 12544 pts/0 Ss 10:05 0:00 bashzhangsan 789 0.0 0.1 9876 4096 pts/0 R+ 10:10 0:00 ps aux
每一列逐字解读:
| | |
|---|
| | |
| | |
| | |
| | |
| | |
| | |
| | 进程在哪个终端运行,? 代表后台守护进程,和终端无关;pts/0 是你当前的终端 |
| | 当前进程处于什么状态,常见状态:R:运行中S:休眠(大部分进程都在休眠,等待任务)T:被暂停 / 停止Z:僵尸进程(已退出但父进程没回收)附加符号:s:会话首进程l:多线程进程<:高优先级N:低优先级+:前台进程组 |
| | |
| | |
| | |
组合二:ps -ef —— System V 风格,查看父子进程关系
这个写法能看到 PPID(父进程 ID),排查进程是谁启动的非常好用。
举例与输出解读
关键列:
UID PID PPID C STIME TTY TIME CMDroot 1 0 0 10:00 ? 00:00:01 /sbin/initzhangsan 456 1 0 10:05 pts/0 00:00:00 bashzhangsan 789 456 0 10:10 pts/0 00:00:00 ps -ef
PPID:父进程 PID。比如上面 ps -ef 的 PPID 是 456,对应 bash 进程,说明 ps 命令是在 bash 终端里运行的。
经典用法:过滤查找指定进程
配合管道符 | 和 grep,可以只看你关心的进程,这是日常最常用的组合。
- 逐成分拆解
ps aux|grep nginx:从所有进程里,只保留包含「nginx」关键词的行
- 效果:只显示和 nginx 相关的进程,快速找到它的 PID 和资源占用。
- 新手坑:输出里一定会有一行
grep nginx 本身,这是 grep 命令自己的进程,不用管。
2. pstree:树形查看进程父子关系
- 作用:以树状结构展示所有进程的父子关系,直观看到谁创建了谁。
- 语法
- 常用选项
举例
典型输出片段:
systemd(1)─┬─systemd-journal(123) ├─sshd(345)─┬─sshd(450)───bash(456)───pstree(790) │ └─sshd(500)───bash(505) └─nginx(600)───nginx(601)
- 解读:最顶层是 1 号 systemd 进程,下面衍生出所有子进程;nginx 有一个主进程和一个工作子进程。
- 新手场景:程序异常退出时,用这个可以快速看进程还在不在、父进程是谁。
3. pgrep:按名字快速查找 PID
- 作用:根据进程名直接返回对应的 PID,不用 grep 过滤,写脚本时特别好用。
- 语法
- 常用选项
举例 1:查找所有 bash 进程的 PID
- 输出:直接返回 PID 数字,比如
456、505。
举例 2:查找 nginx 进程,同时显示名字
- 输出:
600 nginx、601 nginx,左边是 PID,右边是进程名。
三、实时监控进程:动态刷新类命令
静态命令只能看一瞬间的状态,要实时看 CPU、内存变化,就要用动态监控工具。
1. top:系统自带的实时任务管理器
- 作用:相当于 Windows 的任务管理器,3 秒刷新一次,实时展示系统整体负载和所有进程的运行状态,是排查性能问题的第一工具。
- 语法
界面逐行解读(从上到下)
top - 10:30:00 up 2 days, 3:30, 2 users, load average: 0.15, 0.10, 0.08Tasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie%Cpu(s): 2.3 us, 1.1 sy, 0.0 ni, 96.2 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 stMiB Mem : 981.2 total, 720.5 free, 125.3 used, 135.4 buff/cacheMiB Swap: 0.0 total, 0.0 free, 0.0 used. 810.6 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 600 root 20 0 12560 4876 3212 S 1.3 0.5 0:20.12 nginx 123 root 20 0 125600 48768 8900 S 0.7 4.9 0:20.45 systemd-journal
第 1 行:系统概览
top - 10:30:00 up 2 days, 3:30, 2 users, load average: 0.15, 0.10, 0.08
10:30:00up 2 days, 3:302 usersload average: 0.15, 0.10, 0.08:过去 1 分钟、5 分钟、15 分钟的系统平均负载 - 负载长期超过 CPU 核心数,说明系统压力大,需要排查
第 2 行:进程总数统计
Tasks: 78 total, 1 running, 77 sleeping, 0 stopped, 0 zombie
第 3 行:CPU 整体占用
%Cpu(s): 2.3 us, 1.1 sy, 0.0 ni, 96.2 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 st
| | |
|---|
us | | 用户态进程占用 CPU 比例(你的应用程序主要占这个) |
sy | | |
id | | |
wa | | 等待磁盘 IO 的比例,数值高说明磁盘太慢,CPU 在等硬盘 |
hi | | |
第 4-5 行:内存使用
和 free -h 命令展示的信息一致,分别是物理内存和交换分区的总量、已用、剩余、缓存。
- 重点看
avail Mem:实际可用内存,包含可以释放的缓存。
下方进程列表(关键列)
top 常用快捷键(新手必记)
进入 top 界面后,直接按对应按键生效:
| |
|---|
q | |
P | |
M | |
1 | |
k | 杀死进程,按了之后输入 PID 回车,再输入信号回车即可 |
h | |
2. htop:更人性化的 top 升级版
top 是系统自带的,但操作不够友好;htop 是增强版,支持鼠标操作、颜色区分、横向滚动,新手更容易上手。
四、控制进程:启停、终止、前后台切换
1. kill:给进程发信号(终止、暂停等)
- 作用:不是只有「杀死进程」一个功能,它是给进程发送指定的信号,不同信号有不同的作用,最常用的是终止进程。
- 语法
- 不写信号时,默认发 15 号信号
最常用的 3 种信号
| | | |
|---|
15 | | | |
9 | | 强制杀死进程,内核直接销毁进程,程序来不及做任何处理 | |
19 | | | |
⚠️ 新手警告:不要上来就用 kill -9!会导致数据丢失、文件损坏、残留临时文件。先尝试默认的 15 号信号,程序真的卡死了再用 9 号。
举例
例 1:正常终止 PID 为 1234 的进程
例 2:强制杀死 PID 为 1234 的卡死进程
- 拆解:
-9 指定 9 号强制终止信号,内核直接回收进程,无法抗拒。
例 3:暂停 PID 为 1234 的进程
- 暂停后进程还在,只是不运行了,用
kill -18 PID 可以恢复继续运行。
2. killall / pkill:按进程名批量终止
kill 必须知道 PID,killall 和 pkill 可以直接按进程名杀,适合批量结束同名进程。
killall:精确匹配进程名
pkill:模糊匹配进程名
- 语法
- 举例
- ⚠️ 新手警告:模糊匹配容易误杀,用之前最好先
pgrep -l 关键词 确认一下会匹配到哪些进程。
3. 进程的前台、后台切换
默认情况下,你在终端输入命令运行,都是前台进程:会占用你的终端,你没法输入其他命令,必须等它结束。 我们可以把进程放到后台运行:不占用终端,你可以继续干别的。
必备快捷键与命令
| |
|---|
命令 & | |
Ctrl + Z | |
jobs | |
bg 任务号 | |
fg 任务号 | |
完整举例演示(可以跟着操作)
启动一个前台测试进程:运行一个 sleep 程序,休眠 100 秒
此时终端被占用,100 秒内不能干别的。
挂起到后台:按 Ctrl + Z 终端会显示:
查看后台任务:
输出:[1]+ Stopped sleep 100
让它在后台继续运行:
输出:[1]+ sleep 100 &,现在 sleep 在后台继续倒计时,终端可以正常输入命令了。
调回前台:
进程又回到前台,占用终端。
新手注意:后台进程的输出还是会打印到终端上,干扰你操作;真正长期后台运行用 nohup,后面会讲。
五、进阶:进程优先级调整
Linux 会根据进程优先级分配 CPU 时间,优先级越高,分到的 CPU 时间越多,运行越流畅。
- 优先级用
nice 值 表示,范围是 -20 ~ +19 - 普通用户只能把 nice 值往高调(降低优先级),只有 root 才能往低调(提高优先级)
1. nice:启动进程时指定优先级
举例:以低优先级运行压缩命令
nice -n 10 tar -zcvf backup.tar.gz /home/zhangsan
- 拆解:
-n 10 设置 nice 值为 10,比默认的 0 优先级低。 - 场景:后台跑备份、压缩这种不重要的任务,调低优先级,不影响前台正常程序的运行。
2. renice:运行中修改进程优先级
举例:把 PID 1234 的进程优先级调低
- 拆解:把 PID 1234 的 nice 值改成 15,优先级降低。
六、实用:后台常驻运行 nohup
日常运行脚本、服务程序时,关闭终端窗口,进程会被一起杀掉。nohup(No Hang Up,不挂断)可以让进程忽略终端关闭信号,一直在后台运行,直到自己结束。
标准用法
逐成分拆解:
nohup./your_script.sh&- 默认行为:程序的所有输出,会自动写入当前目录下的
nohup.out 文件里,不会打印到终端干扰你。
举例:后台运行一个 Python 服务
- 执行后会输出一个 PID,关闭终端再重新打开,用
ps aux | grep app.py 能看到进程还在运行。
七、新手常见问题与避坑
1. 什么是僵尸进程?怎么处理?
- 子进程退出了,但父进程没有调用 wait 回收它的资源,这个已经死掉的进程就变成了僵尸进程(Z 状态)。
- 僵尸进程已经不运行了,不占 CPU 和内存,只占一个 PID 号,少量僵尸进程不影响系统。
- 处理方法:杀掉它的父进程,父进程退出后,系统会自动回收僵尸进程。
2. 进程杀不死怎么办?
- 先确认是不是用了
kill -9,9 号信号是内核强制销毁,正常没有杀不死的用户进程。 - 如果还是杀不死,大概率是处于「D 状态(不可中断休眠)」,一般是在等磁盘 IO,等 IO 完成就会恢复,或者重启系统。
3. 能不能随便杀系统进程?
绝对不行!比如 PID 1 的 systemd、内核线程,杀掉会直接导致系统崩溃、重启。只杀你自己启动的、确认没用的进程。
八、新手连贯练习流程
可以在你的 WSL 里跟着做一遍,快速掌握:
# 1. 后台启动一个 sleep 进程sleep 300 &# 2. 查看这个进程的 PID 和状态ps aux | grep sleep# 3. 用 top 看它的 CPU 占用(基本是 0,因为在休眠)top# 按 q 退出# 4. 用 renice 把它的优先级改成 10renice 10 -p 刚才的PID# 5. 正常终止这个进程kill 刚才的PID# 6. 确认进程已经消失ps aux | grep sleep