Linux 进程管理入门:ps、top 与 kill
服务器突然变卡,风扇狂转,网页打不开,第一反应往往是重启。
但重启之前先看一眼:到底是哪个进程在捣乱。
进程管理就三个动作:ps 看谁在跑,top 看谁最占资源,kill 停掉失控的那个。学会这三步,服务器卡了不再只会重启。
小节一、ps:先看谁在跑
出问题先列一张进程清单,ps 就是干这个的:
ps aux
这行命令列出系统里所有正在跑的进程。重点看几列:
USER 是谁启动的,%CPU 和 %MEM 占了多少资源,
COMMAND 是它在跑什么命令。一下子就能看出,
是自己的服务在跑,还是某个陌生进程在偷偷吃资源。
只关心某一个服务,可以直接点名过滤:
ps aux | grep nginx
这行是在进程清单里只找带 nginx 的行。
注意结果里会多出一行 grep 自己,那是过滤命令本身,
不是真的 nginx 进程,认准了别误杀。
想看某个进程的完整家族关系,换一种写法:
ps -ef --forest
这样能看到谁是谁启动的父子关系,一个服务拉起的子进程
一目了然,找问题时顺着树往上找根源。
小节二、top:看谁最占资源
ps 是拍一张快照,top 是看实时直播:
top
打开后屏幕每几秒刷新一次,默认按 CPU 占用从高到低排。
最上面几行是系统总览:负载、CPU、内存;下面是进程榜单,
排第一的那个,就是当前最能吃的进程。
top 里按几个键就能换视角:按 M 按内存占用排,
按 P 按 CPU 占用排,按 q 退出。卡住的时候先看榜首:
如果是一个自己认识的服务在冲高,多半是它内部出了问题;
如果是一个不认识的进程,先查清它是什么再动手。
只想看内存大户,不用一直盯着 top 刷屏,也可以拍一张快照:
ps aux --sort=-%mem | head -10
这行是按内存占用从大到小排,只看前 10 名。
一眼定位内存大户,比在 top 里翻找更快。
小节三、kill:停掉失控的进程
找到失控的进程之后再动手。先温和地请它退出:
kill 1234
1234 是进程的编号,也就是 ps 里看到的 PID。
默认的 kill 不带参数,是发一个“请正常退出”的信号,
进程收到后会自己收拾干净再走,这是最体面的停法。
等了几秒还没停,再用强制的办法:
kill -9 1234
-9 是强制结束,进程来不及收拾就直接被干掉。
它只适合对付完全卡死、怎么都不退出的进程,
正常服务不要一上来就用 -9,容易丢数据、留下半截文件。
不知道 PID,只记得进程名字,可以先查再杀:
pgrep -f python
pgrep 按名字找进程编号,确认编号没错再 kill。
名字撞车很常见,比如一台机器上跑着好几个 python 程序,
pgrep 列出的每一个编号都要对上号,确认是目标再动手。
小节四、让长任务在后台自己跑
有些任务要跑很久,比如备份、导数据,终端一关它就跟着停。
先把它挂到后台:
nohup python backup.py > backup.log 2>&1 &
nohup 的意思是终端关了也不停,输出写进 backup.log,
最后的 & 是把它放进后台,终端立刻空出来继续干别的。
想看它跑到哪了,直接看日志文件就行。
事后想找这个后台任务,用 ps 查名字,
或者用 jobs 看当前终端挂起的后台任务:
jobs
jobs 只看得到当前这个终端里挂起的任务,
换个终端就看不到了,所以长任务启动时最好记下它的 PID,
或者把输出写进日志,事后按名字查最稳。
小节五、三个新手常踩的坑
第一,看到 CPU 高就乱杀进程。先看清进程是谁的、是干什么的,
系统关键进程杀错了,服务直接瘫掉。动手前先问一句:
这个进程停了,哪个服务会受影响?答不上来就先不动。
第二,一上来就用 kill -9。强制结束不给进程收尾的机会,
正在写的文件可能只写了一半,数据库可能留下不一致的状态。
先 kill 不带参数等几秒,不行再升级到 -9。
第三,杀错同名进程。一台机器上同名进程可能有好几个,
只凭名字杀很危险。先用 pgrep 对编号,再用 ps 看完整命令行
确认身份,编号和命令行都对上再动手,宁可慢一步也不错杀。
ps 看谁在跑,top 看谁最占资源,kill 只停确认过的失控进程,
长任务挂后台、留日志。服务器下次再卡,先花一分钟看一眼
进程榜单,再决定是重启、停进程,还是放它自己跑完。
- 点赞
- 收藏
- 关注作者
评论(0)