Linux 进程管理入门:从 ps 到 kill 的日常排查
服务器变慢、端口被占、某个服务起不来,十有八九要先看进程。Linux 的进程管理命令不多,ps、top、kill 这几个组合起来,就能覆盖日常排查的大部分场景。
先看一眼:ps 找出进程
最常用的写法是 ps aux,列出系统里所有进程:
ps aux | head -20
输出里最值得看的几列:USER 是谁起的、%CPU 和 %MEM 占了多少资源、COMMAND 是具体命令。只关心某个服务时,用 grep 过滤:
ps aux | grep nginx
注意 grep 自身也会出现在结果里,后面多一行 grep nginx 是正常的,排查时忽略它就行。想按 CPU 或内存排序,换一种写法:
ps aux --sort=-%cpu | head -10 # CPU 占用前 10
ps aux --sort=-%mem | head -10 # 内存占用前 10
只想看某个用户的进程,加 -u:ps -u www-data。想看进程之间的父子关系,用 ps -ef --forest,树状结构一眼看出谁是谁拉起来的。
实时看:top 与 htop
ps 是快照,想看动态变化用 top:
top
默认每 3 秒刷新一次,按 P 按 CPU 排序,按 M 按内存排序,按 q 退出。top 里还能直接按 k 杀进程,不过新手建议先在 ps 里确认好 PID 再动手。
如果机器上装了 htop,体验更好:支持方向键选择、F9 杀进程、鼠标点选,颜色区分也更清楚。没装的话 sudo apt install htop 即可。
找到 PID:pgrep 更直接
很多时候我们只想要进程号,比如写脚本、查监听端口。pgrep 就是干这个的:
pgrep nginx # 输出所有 nginx 的 PID,一行一个
pgrep -f "python app.py" # 按完整命令行匹配
配合 xargs 还能批量处理。反过来,已知 PID 想知道它是什么进程,用 ps -p <PID> -o pid,cmd。
停掉进程:kill 先温柔后强硬
kill 发的是信号,默认 SIGTERM(15),让进程自己收尾退出:
kill 1234 # 温柔地请 PID 1234 退出
等几秒还没退,再升级到 SIGKILL(9),由内核强制结束,不给收尾机会:
kill -9 1234 # 强制结束
顺序不能反:上来就 kill -9 可能丢数据、留脏文件。生产环境尤其要先 TERM、确认无效再 KILL。
按名字杀进程用 pkill:
pkill -f "python app.py"
pkill 匹配的是命令名或完整命令行,写错匹配串可能误杀别的进程。用之前先用 pgrep -f 看一眼会命中哪些 PID,确认无误再执行。
僵尸进程与孤儿进程
ps aux 里 STAT 列出现 Z,就是僵尸进程:进程已经结束,但父进程还没回收它的退出状态。僵尸本身不占内存(只占一个进程表项),少量不用管;大量出现说明父进程有问题,修父进程才是正解,kill 僵尸本身是杀不掉的。
孤儿进程则相反:父进程先退了,子进程被 init(PID 1)接管继续跑。服务启动脚本写得不规范时容易留下孤儿,重启服务后旧进程还在占端口,表现就是"新服务起不来"。这时用 ps -ef --forest 找到它,确认无用后再 kill。
一个排查流程
端口被占、服务起不来,按这个顺序走基本不会绕路:
ss -tlnp | grep 8080 # 先看端口被谁占着,拿到 PID
ps -p <PID> -o pid,user,cmd # 确认这个进程是谁、干什么的
kill <PID> # 温柔停掉;不行再 kill -9
先确认、再动手,是进程管理唯一的铁律。ps 看清、top 看动、kill 分轻重,这三步熟练了,服务器上大部分"起不来、跑不动"的问题都能在几分钟内定位。
- 点赞
- 收藏
- 关注作者
评论(0)