
Linux 进程管理实战
SSH 一断程序就没了?三个命令解决这个烦恼
Linux基础 实战课
Linux 基础实战课 · 进阶篇
————————————————
💬 有次做 VDI 系统升级,需要跑一个长达 40 分钟的数据库迁移脚本。我在 SSH 终端敲下命令,看着进度条在走,中途去喝了杯水——回来一看,SSH 断连了,脚本也停了,进度归零。
那一刻我就学会了两个命令:nohup 和 ps。一个是「断开连接也别停」,一个是「让我看看现在什么在跑」.
今天这篇把进程管理的三个核心动作讲透:查进程、杀进程、后台跑任务。
————————————————
一、查进程:ps 一把梭
ps 是 process status 的缩写。最常用的版本是:
输出字段含义:
字段 | 含义 |
USER | 哪个用户启动的 |
PID | 进程 ID,每个进程的唯一编号 |
%CPU | CPU 使用率 |
%MEM | 内存使用率 |
STAT | 状态:S=休眠 R=运行 Z=僵尸 |
COMMAND | 是什么命令启动的 |
快速定位目标进程:
ps aux | grep nginx | 找 nginx 相关进程 |
ps aux | grep mysql | 找 mysql 相关进程 |
配合 sort 找出吃资源最多的进程:
ps aux --sort=-%mem | head -5 | 内存占用前 5 名 |
ps aux --sort=-%cpu | head -5 | CPU 占用前 5 名 |
二、杀进程:kill 信号量表
知道 PID 就能杀掉进程。kill 这个名字有点误导——它不一定是杀死,而是「发信号」。
信号 | 效果 | 使用场景 |
kill -15 | 优雅关闭(给程序机会善后) | 首选,程序会做清理工作 |
kill -9 | 强制杀死(内核直接回收) | 杀手锏,卡死的时候用 |
kill -1 | 重新加载配置(不重启进程) | 改完配置用这个,不停服务 |
实战写法:
ps aux | grep nginx | 先找到 nginx 的 PID |
pkill -f nginx | 按名字杀(不用找 PID) |
⚠️ kill -9 是最后手段。程序没机会清理临时文件、释放锁、保存状态。能用 kill(默认 -15)解决的问题,别直接上 -9。
三、后台运行:nohup 和 & 的区别
很多人以为加个 & 就够了:
但 SSH 断开后,& 启动的后台进程会收到 SIGHUP 信号,然后退出。这就是我翻车那次的原因。
解决方案是 nohup(no hang up):
nohup ./backup.sh & | 断开终端也不退出 |
nohup ./backup.sh > backup.log 2>&1 & | 把输出记到日志(推荐) |
💡 不指定输出文件的话,nohup 默认输出到 nohup.out。跑多个脚本时会混在一起,所以最好显式指定日志文件名。
如何查看后台任务?
后台任务编号(%1, %2...)只在当前终端有效。nohup 启动的进程不受影响——你 Ctrl+C 关闭终端它照样在跑。
四、实战:标准排查流程
场景:服务器 CPU 突然飙升到 99%。按这个顺序查:
① 找谁在吃 CPU:
ps aux --sort=-%cpu | head -5 | CPU 前 5 名 |
② 看整体负载:
uptime | 1 分钟、5 分钟、15 分钟平均负载 |
③ 盯住某个进程的资源:
ps -p PID -o %cpu,%mem,cmd | 看特定 PID 的资源 |
④ 如果是预期外的进程,先优雅关:
⑤ 还不退就强制杀:
这套流程在 VDI 项目里救过我很多次——某台桌面云服务器突然卡,SSH 上去 ps aux 一看,一个 Java 进程吃了 14GB 内存,kill 掉马上恢复正常。
————————————————
下篇预告:《Linux 防火墙入门:端口开不了?先看看防火墙拦了没有》
💬 你遇到过最头疼的进程卡死是什么情况?
是怎么解决的?评论区分享一下你的「杀进程」经历
👍 点赞💬 留言🔄 转发给需要的朋友
有问题欢迎评论区留言,看到都会回复