Linux进程监控:ps与top使用全解析
时间:2025-07-24 11:28:36 466浏览 收藏
最近发现不少小伙伴都对文章很感兴趣,所以今天继续给大家介绍文章相关的知识,本文《Linux进程监控方法详解:ps与top使用指南》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
Linux系统中实时或回溯监控进程的核心工具是ps和top。1.ps提供某一时刻的进程快照,常用参数组合为ps aux(显示所有用户进程及资源占用)和ps -ef(显示完整格式包括PPID,用于查看进程父子关系)。2.top则是实时交互式仪表盘,动态刷新并按CPU使用率排序,顶部显示系统负载、内存等概览信息,支持按键操作如按M键按内存排序、k键杀死进程。3.辅助工具包括htop(彩色界面、更直观交互)、glances(全方位系统监控仪表盘)、pstree(树状显示进程父子关系)。4.诊断性能问题时关注CPU高占用(可能死循环或I/O阻塞)、内存持续增长(内存泄漏或数据量大)、僵尸进程过多(父进程未回收)、I/O Wait过高(磁盘性能瓶颈)。5.在脚本中常用ps结合grep和awk获取PID,但推荐使用pgrep和pkill实现更健壮的进程管理,如检查服务是否运行、优雅停止或强制终止进程。
在Linux系统里,要实时了解或者回溯系统里跑着哪些程序、它们在干嘛、占用多少资源,核心的工具就是ps
和top
。它们一个给你提供某个瞬间的“快照”,另一个则像一个实时的“仪表盘”,各有各的用处。

解决方案
Linux下的进程监控,说白了就是用命令行工具去查看和管理系统上运行的进程。最常用的自然是ps
和top
,它们各自提供了不同的视角和交互方式。
ps
(Process Status)就像是给系统拍了一张照片,它显示的是命令执行那一刻的进程状态。我个人觉得,ps
最常用的参数组合就是ps aux
或者ps -ef
。

ps aux
:这个组合我用得最多,它会显示所有用户的所有进程,包括没有控制终端的进程。输出里通常包含用户(USER)、进程ID(PID)、CPU占用(%CPU)、内存占用(%MEM)、虚拟内存大小(VSZ)、物理内存大小(RSS)、终端(TTY)、进程状态(STAT)、启动时间(START)、运行时间(TIME)和命令行(COMMAND)。当你需要快速定位某个进程,或者想知道哪些进程占用资源比较多时,ps aux | head -n 1; ps aux | sort -rnk 3,4 | head -n 10
这种用法就能很快找出CPU或内存大户。ps -ef
:这个参数组合则会显示所有进程的完整格式列表,包括父进程ID(PPID)。如果你想看进程间的父子关系,或者想找到某个服务的主进程,这个就很有用。比如,要找Nginx的master进程,ps -ef | grep nginx
就能一目了然。
而top
则完全是另一种体验。它是一个实时的、交互式的进程查看工具,有点像一个动态的仪表盘。你一运行top
,它会每隔几秒刷新一次,显示当前系统运行的进程列表,并按CPU使用率从高到低排序。最上面还会显示系统的整体负载、CPU使用情况、内存使用情况等概览信息。
在top
界面里,你可以做很多操作:

- 按
M
键可以按内存使用率排序。 - 按
P
键可以按CPU使用率排序(默认就是)。 - 按
k
键然后输入PID可以杀死一个进程。 - 按
q
键退出。
我通常会用top
来做实时故障排查。比如,系统突然变慢了,我第一反应就是敲个top
,看看是哪个进程突然飙高了CPU或者内存,这比ps
那种“盲人摸象”式的快照要直观得多。
除了ps和top,还有哪些工具可以辅助Linux进程监控?
虽然ps
和top
是基础,但在实际工作中,我们还有一些更“人性化”或者功能更强大的工具来辅助进程监控。我个人比较喜欢用htop
和glances
,它们在某种程度上弥补了top
在视觉和信息密度上的不足。
htop
:你可以把它看作是top
的增强版。它提供了彩色的、更直观的界面,你可以用鼠标或者键盘上下左右滚动,直接选择进程进行操作(比如杀死、改变优先级)。htop
默认会显示每个CPU核心的使用率,以及一个漂亮的内存和交换空间使用条。对我来说,htop
最大的优势是它的交互性,查找和操作进程都非常方便,比top
那种纯键盘操作要友好得多。安装也很简单,通常sudo apt install htop
或sudo yum install htop
就能搞定。glances
:如果说htop
是top
的升级,那glances
就是全方位的系统监控仪表盘。它不仅能监控进程,还能监控CPU、内存、网络、磁盘I/O、传感器信息等等,而且同样是实时刷新,界面信息量巨大但排版合理。它甚至可以运行在客户端/服务器模式下,远程监控多台机器。当我想对一台服务器进行全面体检时,glances
是我的首选。它通常需要用pip安装:pip install glances
。pstree
:这个工具虽然不直接监控资源,但它能以树状结构显示进程的父子关系。在排查某些服务启动异常,或者想搞清楚一个复杂应用的所有子进程时,pstree -p
(显示PID)或者pstree -apu
(显示PID、用户名、命令行)能提供非常清晰的视图。这在理解系统启动流程或者服务依赖关系时特别有用,能避免很多猜测。
如何根据进程监控数据诊断系统性能问题?
仅仅看到数据是不够的,关键在于如何解读这些数据来判断系统出了什么问题。我通常会关注几个核心指标和现象:
- CPU使用率居高不下:
- 现象:
top
里某个或某几个进程的%CPU
值长期接近100%,或者所有CPU核心的利用率都非常高。 - 诊断:这通常意味着某个程序陷入了死循环、正在进行大量的计算、或者被I/O阻塞但又无法释放CPU。用
top
可以迅速定位是哪个进程。如果是Web服务器,可能是请求量过大;如果是数据库,可能是慢查询;如果是自定义程序,可能存在代码逻辑问题。进一步可以结合strace
(跟踪系统调用)或perf
(性能分析工具)来深入分析具体是哪部分代码在消耗CPU。
- 现象:
- 内存占用持续增长:
- 现象:
top
或ps aux
里,某个进程的%MEM
或RSS
值持续攀升,或者系统的空闲内存越来越少,甚至开始大量使用交换空间(Swap)。 - 诊断:这很可能是内存泄漏的迹象,程序分配了内存但没有及时释放。也可能是程序需要处理的数据量确实非常大。如果系统开始频繁使用Swap,性能会急剧下降,因为磁盘I/O比内存慢得多。这时,我通常会尝试重启这个服务,如果问题依然存在,就需要检查程序的代码逻辑或者配置。
- 现象:
- 僵尸进程(Zombie Processes)过多:
- 现象:
ps aux
里,STAT
列出现大量Z
(或者Z+
)状态的进程。 - 诊断:僵尸进程是子进程已经终止,但其父进程还没有调用
wait()
或waitpid()
来回收其资源。它们虽然不占用CPU和内存,但会占用进程ID(PID),如果数量过多,可能导致新的进程无法创建。这通常是父进程编程错误导致的。解决办法是找到并修复父进程的逻辑,或者杀死父进程让init进程(PID 1)来回收这些僵尸。
- 现象:
- I/O Wait过高:
- 现象:
top
的CPU行里,wa
(wait I/O)的值很高。 - 诊断:这表示CPU大部分时间都在等待磁盘I/O操作完成。通常是磁盘读写速度跟不上程序的请求速度,或者某个程序正在进行大量的文件读写。结合
iotop
或iostat
可以进一步确认是哪个进程在进行大量的I/O操作,以及磁盘本身的性能瓶颈。
- 现象:
在自动化脚本中,如何有效利用ps命令进行进程管理?
在自动化脚本里,ps
命令更多地是作为一种“探测器”或者“过滤器”,用来判断某个服务是否在运行,或者获取其PID以便进行下一步操作。我很少直接在脚本里用top
,因为它交互性太强,不适合自动化。
一个常见的场景是,在启动一个服务之前,先检查它是否已经运行。
#!/bin/bash SERVICE_NAME="my_custom_service" # 假设这是你的服务名 SERVICE_COMMAND="/usr/local/bin/my_custom_service --daemon" # 假设这是服务的启动命令 # 检查服务是否正在运行 # 使用 [s]ervice_name 来避免grep命令本身被匹配到 if ps aux | grep -v grep | grep "${SERVICE_NAME}" > /dev/null; then echo "${SERVICE_NAME} is already running." else echo "${SERVICE_NAME} is not running, starting it now..." ${SERVICE_COMMAND} & # 后台启动服务 if [ $? -eq 0 ]; then echo "${SERVICE_NAME} started successfully." else echo "Failed to start ${SERVICE_NAME}." fi fi # 另一个场景:获取进程ID并杀死 # 注意:这里直接用kill -9是强制终止,生产环境尽量先尝试kill -15 # PID=$(ps aux | grep -v grep | grep "${SERVICE_NAME}" | awk '{print $2}') # if [ -n "$PID" ]; then # echo "Killing ${SERVICE_NAME} (PID: ${PID})..." # kill -9 "$PID" # else # echo "${SERVICE_NAME} is not running." # fi # 更健壮的方式:使用 pgrep 和 pkill # pgrep 可以直接根据进程名查找PID # pkill 可以直接根据进程名发送信号 if pgrep -f "${SERVICE_NAME}" > /dev/null; then echo "${SERVICE_NAME} is running. PID: $(pgrep -f "${SERVICE_NAME}")" echo "Attempting to gracefully stop ${SERVICE_NAME}..." pkill -TERM -f "${SERVICE_NAME}" # 尝试发送TERM信号 sleep 5 # 等待进程退出 if pgrep -f "${SERVICE_NAME}" > /dev/null; then echo "${SERVICE_NAME} did not stop gracefully, forcing kill..." pkill -KILL -f "${SERVICE_NAME}" # 强制杀死 else echo "${SERVICE_NAME} stopped successfully." fi else echo "${SERVICE_NAME} is not running." fi
在这个例子里,我更倾向于使用pgrep
和pkill
。它们是专门为脚本设计的工具,比ps aux | grep | awk
这种管道组合要更简洁、更不容易出错。pgrep -f
可以匹配完整的命令行,而pkill -f
则可以直接根据命令行发送信号。这在自动化运维脚本中非常实用,能有效避免误操作,并提高脚本的健壮性。
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Linux进程监控:ps与top使用全解析》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
463 收藏
-
440 收藏
-
123 收藏
-
237 收藏
-
294 收藏
-
144 收藏
-
358 收藏
-
303 收藏
-
300 收藏
-
228 收藏
-
286 收藏
-
467 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习