Linux 进程管理入门:ps、top 与 kill 的正确用法
服务器跑着跑着变卡,第一反应往往是「内存不够了」或者「磁盘满了」,但很多时候真凶是一个失控的进程:死循环占满 CPU、内存泄漏越吃越多、僵尸进程越攒越多。学会看进程、管进程,是排查 Linux 服务器问题的基本功,常用的就三组命令:ps、top 和 kill。
先看当前都有哪些进程在跑。ps aux 是最常用的一条:
ps aux
输出里每行一个进程,重点看这几列:USER 是谁起的、%CPU 和 %MEM 占了多少资源、STAT 是进程状态、COMMAND 是启动命令。STAT 里常见的字母要认得:R 正在运行、S 睡眠等待、D 不可中断的等待(通常在等磁盘 IO)、Z 是僵尸进程、T 被暂停了。一个进程长期处于 D 状态,往往说明磁盘 IO 出了问题,而不是 CPU 不够。
ps aux 的输出通常很长,配合 grep 只看自己关心的:
ps aux | grep nginx
注意这条命令本身也会出现在结果里——grep nginx 这个进程自己也带 nginx 字样。想排除它可以写成 grep [n]ginx,方括号的写法让 grep 自身不再匹配,是个实用的小技巧。
如果想看某个进程的完整树形关系,用 pstree 更直观:
pstree -p
它会把父子进程按树状展开,-p 显示每个进程的 PID。找「谁是谁拉起来的」时比 ps 的平铺列表好用得多,比如确认某个后台服务是不是由 systemd 正常拉起的。
ps 是快照,只看某一刻。要看资源占用随时间的变化,用 top:
top
top 默认每三秒刷新一次,按 CPU 占用从高到低排序。界面分上下两部分:上面是系统总览(负载、任务数、CPU 与内存总量),下面是进程列表。几个常用按键记一下:按 M 改按内存排序,按 P 切回按 CPU 排序,按 1 展开每个 CPU 核心的占用情况,按 q 退出。
如果只想看自己的进程,不想被系统进程干扰,启动时加个用户过滤:
top -u alix
嫌 top 界面太花哨,也可以用 htop——支持鼠标点击、方向键滚动、按 F9 直接杀进程,交互友好得多。很多发行版默认没装,需要自己装一个。
找到问题进程,下一步就是处理它。kill 不是「杀死」的同义词,它本质是给进程发信号:
kill 1234
不带信号编号时默认发 SIGTERM(信号 15),意思是「请你自己收拾干净再退出」。写得规矩的程序收到后会保存状态、释放资源再走,这是最体面的停法,应该先试它。
等几秒还没退,再升级:
kill -9 1234
-9 是 SIGKILL,由内核直接终结进程,不给它任何收尾机会。数据没来得及落盘就可能丢,而且僵尸进程对 -9 也没用——僵尸进程已经死了,只是父进程还没回收它的退出状态,杀它没用,得去找它的父进程处理。
还有两个常用信号值得知道。kill -HUP 1234(信号 1)常用来让服务重新读配置文件,很多守护进程收到它会平滑重载而不中断服务;kill -STOP 1234(信号 19)是暂停进程,kill -CONT 1234(信号 18)再恢复,调试时偶尔能派上用场。
最后说一个常见坑:杀进程先确认 PID 没看错行。ps aux | grep 的结果里经常一行挨着一行,PID 在第二列,kill 之前先用 ps -p 1234 -o pid,cmd 核对一下要杀的到底是谁。生产环境上一个手滑杀错主进程,代价比多等几秒大得多。
总结一下排查节奏:先 ps aux 看全貌、top 看动态占用,定位到问题进程后先 SIGTERM 体面退出、不行再 -9,杀之前务必核对 PID。这三组命令够用很久,下一步可以去学 systemd 的 systemctl status,把进程管理和服务管理串起来。
- 点赞
- 收藏
- 关注作者
评论(0)