2032 字
10 分钟
8.Linux 进程管理
1. 什么是进程?
在 Linux 中,进程(Process) 是正在运行的程序实例,是操作系统资源分配的基本单位。
- 每个进程都有唯一的编号 —— PID(Process ID)
- 所有进程都由一个“祖先”进程
init或systemd(PID=1)派生而来 - 进程会占用 CPU、内存、文件描述符等系统资源
🔧 示例:当你运行 vim a.txt,系统就会创建一个新的进程来执行这个编辑操作。
2. 进程的类型
| 类型 | 说明 |
|---|---|
| 前台进程 | 占据终端,用户可交互,结束前无法输入其他命令 |
| 后台进程 | 在后台运行,不阻塞终端,可用于长期任务 |
| 守护进程(Daemon) | 长期运行的服务进程(如 sshd、crond),通常以 d 结尾,如 httpd, rsyslogd |
📌 小知识:
- 守护进程一般没有控制终端
- 多数通过
systemctl start xxx.service启动
3. 进程的状态说明
ps 命令中常见的状态码:
| 状态字母 | 含义 |
|---|---|
| R (Running/Runnable) | 正在运行或就绪,等待 CPU 调度 |
| S (Sleeping) | 可中断睡眠(等待事件发生,如 I/O) |
| D (Uninterruptible Sleep) | 不可中断 sleep(通常是磁盘 I/O 中,不能被 kill -9 杀死)⚠️ 危险 |
| T (Stopped) | 已停止(由 job control 暂停,如 Ctrl+Z) |
| Z (Zombie) | 僵尸进程 —— 子进程已退出但父进程未回收其资源 ❌ 应避免大量出现 |
📝 补充:
+表示前台进程组<表示优先级高(nice < 0)N表示优先级低(nice > 0)
4. 常用进程查看命令(ps, top, htop)
✅ ps —— 显示当前时刻的进程快照
⚠️ 注意:
ps是静态的,不会实时更新
常见用法组合
| 命令 | 作用 |
|---|---|
ps | 当前 shell 下的进程 |
ps aux | 查看系统所有进程(推荐!BSD 风格) |
ps -ef | 标准 UNIX 风格输出,常用于找父进程 PPID |
🔹 输出字段解释(ps aux):
| 字段 | 说明 |
|---|---|
| USER | 运行该进程的用户 |
| PID | 进程 ID |
| %CPU | 占用 CPU 百分比 |
| %MEM | 占用内存百分比 |
| VSZ | 虚拟内存大小(KB) |
| RSS | 物理内存实际使用量(KB) |
| TTY | 关联的终端设备 |
| STAT | 进程状态 |
| START | 启动时间 |
| TIME | 累计 CPU 使用时间 |
| COMMAND | 启动命令 |
🔧 实战技巧:
# 查找指定进程(如 nginx)ps aux | grep nginx
# 按内存降序排列 Top 5ps aux --sort=-%mem | head -6
# 查某个用户的进程ps -u alice✅ top —— 动态实时监控进程
相当于 Linux 的“任务管理器”。
启动后常用快捷键:
| 键位 | 功能 |
|---|---|
P | 按 CPU 使用率排序 |
M | 按内存使用率排序 |
k | 杀死某个进程(输入 PID 和信号) |
q | 退出 |
1 | 显示每个 CPU 核心的负载情况 |
🟢 提升体验:安装 htop(更友好)
# 安装yum install htop # CentOSapt install htop # Ubuntu
# 使用htop✅ htop 优势:
- 彩色界面
- 支持鼠标点击
- 显示 CPU / 内存条状图
- 可直接滚动查看全部进程
5. 进程树与父子关系(pstree)
显示进程之间的父子关系,帮助理解服务是如何启动的。
pstree # 图形化展示进程树pstree -p # 显示 PIDpstree -p | grep httpd示例输出片段:
systemd─┬─sshd───sshd───bash───pstree ├─cron └─httpd───httpd📌 重要提示:父进程死亡可能导致子进程变成“孤儿进程”,最终被 systemd 收养(PPID=1)。
6. 杀死或终止进程(kill, pkill, killall)
✅ kill —— 向进程发送信号
语法:kill [信号] PID
常见信号对照表
| 信号编号 | 名称 | 作用 |
|---|---|---|
| 1 | SIGHUP | 重启进程(常用于服务平滑重载配置) |
| 9 | SIGKILL | 强制杀死(不可捕获/忽略)⚠️ 最暴力 |
| 15 | SIGTERM | 正常终止(允许清理资源,默认值) |
💡 示例:
kill 1234 # 默认发送 SIGTERM,请求优雅退出kill -9 1234 # 强制杀死,不给机会保存数据!慎用!kill -HUP $(pgrep nginx) # 通知 nginx 重新加载配置文件✅ pkill / pgrep —— 按名称查找并操作进程
pgrep sshd # 查出所有 sshd 的 PIDpkill sshd # 终止所有名为 sshd 的进程pkill -f "python script.py" # 按完整命令行匹配✅ killall —— 按名字终杀所有同名进程
killall firefox # 关闭所有 Firefox 进程killall -9 httpd # 强制终止所有 httpd⚠️ 注意安全:不要随意对关键服务使用
-9!
7. 信号机制详解(Signal)
Linux 中进程间通信的重要方式之一。当按下 Ctrl+C 或执行 kill 命令时,其实就是发送了一个信号。
常见信号总结
| 信号 | 触发场景 | 是否可忽略 |
|---|---|---|
| SIGINT (2) | Ctrl+C 中断程序 | ✅ 可被捕获 |
| SIGQUIT (3) | Ctrl+\ 产生 core dump | ✅ |
| SIGTERM (15) | 软件正常终止 | ✅ |
| SIGKILL (9) | 不能被捕获,立即终止 | ❌ 不可拦截 |
| SIGHUP (1) | 终端断开或配置重载 | ✅ (某些服务如 nginx 会重读配置) |
| SIGSTOP (19) | 暂停进程(类似 Ctrl+Z) | ❌ 不可忽略 |
| SIGCONT (18) | 恢复暂停的进程 | ✅ |
🎯 应用建议:
- 优先尝试
SIGTERM(15)让程序自行关闭资源 - 只有无法响应才用
SIGKILL(9)
8. 作业控制:前台/后台进程管理(&、jobs、fg、bg)
适用于在同一终端中管理多个任务。
🔧 后台运行命令
long_task.sh & # 加 & 放入后台运行系统返回:
[1] 1234 # [作业号] PID🔍 查看后台作业
jobs # 列出当前终端的所有作业jobs -l # 显示详细信息(含 PID)输出示例:
[1]+ Running ./backup.sh &⚙️ 前后台切换
Ctrl+Z # 暂停前台进程(变为 stopped 状态)bg %1 # 将作业号为 1 的进程转为后台继续运行fg %1 # 将作业号为 1 的进程调回前台📦 nohup —— 忽略挂断信号,保持运行
即使你关闭终端也不受影响!
nohup long_script.sh &
# 输出自动重定向到 nohup.out 文件tail -f nohup.out✅ 适用于远程执行耗时脚本!
9. 实时性能监控工具
除了 top 和 htop,还有以下专业工具:
| 工具 | 用途 |
|---|---|
vmstat 1 | 查看系统整体健康:进程、内存、I/O、CPU |
iostat -x 1 | 查看磁盘 I/O 性能瓶颈 |
iotop | 查看哪个进程最耗磁盘 IO |
sar(来自 sysstat 包) | 收集和查看历史性能数据 |
🔧 示例:
# 每秒刷新一次,观察磁盘性能iostat -x 1
# 查看谁占用了最多的 I/Oiotop10. 实战:服务器变慢了怎么办?
👉 典型问题:网站响应延迟、登录卡顿、load average 很高
🔎 排查流程(按顺序进行)
# 1. 查看平均负载uptime# 输出:..., load average: 4.23, 3.87, 2.91 → 如果 > CPU 核数说明过载
# 2. 查看资源占用 TOPtop -c # 看哪些进程吃 CPU 或内存→ 发现有一个 python 脚本占了 98% CPU
# 3. 定位具体命令ps aux | grep <PID>→ 确认为某个循环未退出的脚本
# 4. 决策处理方案kill -15 <PID> # 先软终,看是否响应sleep 5kill -9 <PID> # 强制结束(若无效)
# 5. 补救措施- 修改脚本逻辑增加退出条件- 加入监控告警- 使用 crontab 替代长跑脚本?🚨 其他常见原因检查清单:
| 问题 | 检查命令 |
|---|---|
| 是否磁盘满了? | df -h |
| 是否内存不足导致频繁 swap? | free -h, vmstat |
| 是否网络堵塞? | iftop, nethogs |
| 是否日志疯狂写入? | ls -laS /var/log/, journalctl --disk-usage |
| 是否遭黑客入侵挖矿? | ps aux | grep XMR(XMRig 等病毒) |
📘 学习建议
| 建议 | 说明 |
|---|---|
| ✅ 多动手练习 | 在虚拟机中模拟各种进程情况 |
| ✅ 记住几个核心命令 | ps aux, top, kill, pkill, htop |
| ✅ 建立故障排查思维模型 | “现象 → 工具 → 分析 → 解决” 四步法 |
| ✅ 了解应用行为特征 | 如 mysql、nginx 的典型进程数量 |
| ✅ 日志配合分析 | 查进程异常时也看 /var/log/messages 和 journalctl |
📌 总结一张表:常用进程管理命令速查
| 功能 | 命令 |
|---|---|
| 查看所有进程 | ps aux 或 ps -ef |
| 实时监控进程 | top 或 htop |
| 查看进程树 | pstree -p |
| 按名称查 PID | pgrep firefox |
| 按名称杀进程 | pkill firefox 或 killall firefox |
| 发送信号 | kill -9 1234 |
| 后台运行 | command & |
| 忽略终端关闭 | nohup command & |
| 查看作业 | jobs |
| 切换前后台 | fg %1, bg %1 |
| 查找高 CPU 进程 | ps aux --sort=-%cpu | head -10 |