8.Linux 进程管理

2032 字
10 分钟
8.Linux 进程管理

1. 什么是进程?#

在 Linux 中,进程(Process) 是正在运行的程序实例,是操作系统资源分配的基本单位。

  • 每个进程都有唯一的编号 —— PID(Process ID)
  • 所有进程都由一个“祖先”进程 initsystemd(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启动命令

🔧 实战技巧:

Terminal window
# 查找指定进程(如 nginx)
ps aux | grep nginx
# 按内存降序排列 Top 5
ps aux --sort=-%mem | head -6
# 查某个用户的进程
ps -u alice

✅ top —— 动态实时监控进程#

相当于 Linux 的“任务管理器”。

启动后常用快捷键:

键位功能
P按 CPU 使用率排序
M按内存使用率排序
k杀死某个进程(输入 PID 和信号)
q退出
1显示每个 CPU 核心的负载情况

🟢 提升体验:安装 htop(更友好)

Terminal window
# 安装
yum install htop # CentOS
apt install htop # Ubuntu
# 使用
htop

✅ htop 优势:

  • 彩色界面
  • 支持鼠标点击
  • 显示 CPU / 内存条状图
  • 可直接滚动查看全部进程

5. 进程树与父子关系(pstree)#

显示进程之间的父子关系,帮助理解服务是如何启动的。

Terminal window
pstree # 图形化展示进程树
pstree -p # 显示 PID
pstree -p | grep httpd

示例输出片段:

systemd─┬─sshd───sshd───bash───pstree
├─cron
└─httpd───httpd

📌 重要提示:父进程死亡可能导致子进程变成“孤儿进程”,最终被 systemd 收养(PPID=1)。


6. 杀死或终止进程(kill, pkill, killall)#

✅ kill —— 向进程发送信号#

语法:kill [信号] PID

常见信号对照表#

信号编号名称作用
1SIGHUP重启进程(常用于服务平滑重载配置)
9SIGKILL强制杀死(不可捕获/忽略)⚠️ 最暴力
15SIGTERM正常终止(允许清理资源,默认值)

💡 示例:

Terminal window
kill 1234 # 默认发送 SIGTERM,请求优雅退出
kill -9 1234 # 强制杀死,不给机会保存数据!慎用!
kill -HUP $(pgrep nginx) # 通知 nginx 重新加载配置文件

✅ pkill / pgrep —— 按名称查找并操作进程#

Terminal window
pgrep sshd # 查出所有 sshd 的 PID
pkill sshd # 终止所有名为 sshd 的进程
pkill -f "python script.py" # 按完整命令行匹配

✅ killall —— 按名字终杀所有同名进程#

Terminal window
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)#

适用于在同一终端中管理多个任务。

🔧 后台运行命令#

Terminal window
long_task.sh & # 加 & 放入后台运行

系统返回:

[1] 1234 # [作业号] PID

🔍 查看后台作业#

Terminal window
jobs # 列出当前终端的所有作业
jobs -l # 显示详细信息(含 PID)

输出示例:

[1]+ Running ./backup.sh &

⚙️ 前后台切换#

Terminal window
Ctrl+Z # 暂停前台进程(变为 stopped 状态)
bg %1 # 将作业号为 1 的进程转为后台继续运行
fg %1 # 将作业号为 1 的进程调回前台

📦 nohup —— 忽略挂断信号,保持运行#

即使你关闭终端也不受影响!

Terminal window
nohup long_script.sh &
# 输出自动重定向到 nohup.out 文件
tail -f nohup.out

✅ 适用于远程执行耗时脚本!


9. 实时性能监控工具#

除了 tophtop,还有以下专业工具:

工具用途
vmstat 1查看系统整体健康:进程、内存、I/O、CPU
iostat -x 1查看磁盘 I/O 性能瓶颈
iotop查看哪个进程最耗磁盘 IO
sar(来自 sysstat 包)收集和查看历史性能数据

🔧 示例:

Terminal window
# 每秒刷新一次,观察磁盘性能
iostat -x 1
# 查看谁占用了最多的 I/O
iotop

10. 实战:服务器变慢了怎么办?#

👉 典型问题:网站响应延迟、登录卡顿、load average 很高

🔎 排查流程(按顺序进行)#

Terminal window
# 1. 查看平均负载
uptime
# 输出:..., load average: 4.23, 3.87, 2.91 → 如果 > CPU 核数说明过载
# 2. 查看资源占用 TOP
top -c # 看哪些进程吃 CPU 或内存
发现有一个 python 脚本占了 98% CPU
# 3. 定位具体命令
ps aux | grep <PID>
确认为某个循环未退出的脚本
# 4. 决策处理方案
kill -15 <PID> # 先软终,看是否响应
sleep 5
kill -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/messagesjournalctl

📌 总结一张表:常用进程管理命令速查#

功能命令
查看所有进程ps auxps -ef
实时监控进程tophtop
查看进程树pstree -p
按名称查 PIDpgrep firefox
按名称杀进程pkill firefoxkillall firefox
发送信号kill -9 1234
后台运行command &
忽略终端关闭nohup command &
查看作业jobs
切换前后台fg %1, bg %1
查找高 CPU 进程ps aux --sort=-%cpu | head -10

文章目录