查看服务器进程最直接的方法是使用ps aux或top命令,前者输出静态快照,后者提供实时刷新视图。要快速定位异常进程,建议先用top按CPU或内存排序,再用ps -ef配合grep精确匹配进程名。
服务器查看进程命令有哪些?先分清实时与快照
日常运维中,查看服务器进程的场景贯穿始终:网站变卡要查进程、怀疑被入侵要查进程、部署新服务要确认启动状态也得查进程,不同场景需要不同的查看方式,刚上手时容易混淆ps和top的定位,其实它们本质上是两种视角。
top命令:动态追踪CPU和内存占用
top是Linux系统自带的实时进程监视器,刷新频率默认3秒一次,打开后,上半部分显示系统负载、CPU使用率、内存总量和剩余量,下半部分按进程逐行展示PID、用户、CPU%、MEM%、物理内存占用等字段。
操作上两件事需要记住:按大写字母P按CPU使用率降序排列,按大写字母M按内存占用降序排列,如果看到某个Java进程CPU长期飙到300%、400%,基本可以判定代码死循环或GC异常,按q键退出视图。
ps命令:抓取某一瞬间的静态快照
ps用于输出命令执行那一刻的进程状态,结果只显示一次,最常用的组合有三个:
ps aux:以BSD风格展示所有进程。a表示所有终端进程,u展示用户和CPU/内存占用,x包含不占用终端的后台进程。ps -ef:以Unix风格展示完整命令行参数,适合搭配grep过滤。ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu:自定义输出字段,按CPU占用降序排列,一行一条,信息密度最高。
业内专家指出,线上排查进程问题时应优先使用ps aux,因为它的输出格式对新手最友好,CPU和内存百分比直接可见。
配合grep精准锁定目标进程
查看所有进程后,输出可能长达几十甚至几百行,用管道符组合过滤是标准做法:
ps aux | grep java
ps -ef | grep nginx
注意grep本身也会出现在结果里,通常还会额外匹配到一条带grep --color=auto的进程,想排除这条干扰信息,可以使用ps aux | grep java | grep -v grep,或者用pgrep -l java更简洁地只输出PID和进程名。
服务器进程占用过高怎么排查?三步定位异常源头
日常运维中,查看服务器进程只是第一步,真正棘手的是发现某个进程占满CPU或内存,却不确定它是正常业务还是恶意程序,建议按照下面三步走,每一步都有明确的目标。
第一步:用top确认异常PID
进入top后按P键按CPU排序,先用眼睛扫几遍列表,重点关注两点:一是CPU%接近100%的进程,二是占用率远高于同类型服务的进程,记下异常进程的PID,这是后续排查的唯一线索。
第二步:用ps -p查看该进程的详细信息
拿到PID后,执行ps -p 12345 -o lstart,etime,cmd,这条命令会输出进程的启动时间、已运行时长和完整命令行参数,结合业务场景判断:
- 启动时间恰好是几分钟前,而这段时间服务器出现异常,说明进程刚被拉起,可能是定时任务或恶意脚本触发的。
- 命令行参数指向
/tmp、/var/tmp等目录,大概率是可疑文件。 - 启动时间很久且命令行正常,更可能是业务本身资源消耗过大。
第三步:分析进程与查询其真实身份
使用ls -l /proc/12345/exe可以查看进程的实际执行文件路径,这个路径比命令行参数更准确地反映进程来源,再用cat /proc/12345/status查看进程状态和启动用户,如果发现是nobody用户或www-data用户执行的挖矿程序,应立即处理。
完成这三步后,处理方式也清晰起来,对于误启动的业务进程,直接kill后重启服务即可,对于无法确认身份的异常进程,建议先执行kill -15发送终止信号,观察是否反弹,若不反弹再用kill -9强制结束。
遇到kill不掉的进程怎么办?搞清楚僵尸进程和D状态的真相
很多人在排查服务器进程时遇到过kill -9都无法清除的进程,第一时间想到的是权限不足或进程被保护,多数情况下是遇到了僵尸进程或不可中断睡眠状态。
僵尸进程的本质是“尸体”
进程退出后,父进程尚未调用wait()回收其资源,此时子进程变成僵尸状态,标记为Z,僵尸进程不占用CPU和内存,但会占用一个PID和进程表项,数量过多会导致新进程无法创建。
查看方法很简单:
ps aux | grep Z
解决路径也很明确:杀掉僵尸进程的父进程,PID为1的init进程会接管并清理僵尸进程,如果父进程是nginx master或java主进程,直接重启对应服务即可。
D状态进程是正在等待I/O
D表示不可中断睡眠,常见原因是大量磁盘I/O操作、NFS挂载目录无响应、网络存储连接超时,这类进程无法用常规信号终止,因为是内核层面在阻塞,处理思路是检查磁盘读写是否异常,执行
iostat -x 2观察磁盘使用率,恢复底层存储后再尝试kill。
行业共识认为,D状态进程持续存在超过半小时,应优先检查存储系统健康状况,而不是反复kill进程。
Q&A:查看服务器进程时的几个高频疑问
问:ps aux和ps -ef输出结果有什么区别?
ps aux侧重于展示CPU和内存占用率,适合快速定位资源大户。ps -ef更强调父子进程关系和完整命令行,适合排查进程依赖关系,两者不冲突,结合使用效果最好。
问:如何查看某个端口对应的服务器进程?
使用netstat -tlnp | grep 端口号,输出结果最后一列就是进程PID和进程名,如果系统未安装netstat,改用ss -tlnp | grep 端口号,效果相同。
问:服务器重启后进程还在吗?
普通进程重启后不会自动启动,除非在systemctl中设置了enable开机自启,或者写入了/etc/rc.local,查看进程是否设置了开机自启,可以用systemctl list-unit-files | grep 服务名确认状态栏显示为enabled还是disabled。
掌握查看服务器进程的方法,本质上等于掌握了服务器运行状态的语言,先用top建立整体认知,再用ps深挖细节,最后用grep和pidof快速定位目标,这套思路适用于从入门到中高级的所有运维场景,命令本身并不复杂,关键在于理解每个字段的含义和不同命令的适用场景,在遇到资源异常时保持冷静,按顺序排查,多数问题都能在半小时内定位清楚。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/744755.html





