0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux系统中这三个命令的完整功能和正确查看方法

马哥Linux运维 来源:马哥Linux运维 2026-04-21 11:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景与问题

Linux 系统的日常运维中,监控进程资源使用情况是最频繁的工作之一。当服务器 CPU 突然飙高、内存告警、或者业务响应变慢时,运维工程师首先要做的事情就是查看系统资源使用状况。top、ps、free这三个命令几乎是每个运维人员每天都要敲几十遍的工具。

然而,很多初中级运维人员对这些命令的了解仅限于最基本的用法。看到top输出满屏的数据,不知道该关注哪几列;执行ps aux输出一大堆进程,不知道如何过滤出关键信息;free显示的内存数值和实际感受对不上,不知道 buffers 和 cache 有什么区别。本文将从系统原理出发,深入讲解这三个命令的完整功能和正确查看方法,让运维人员能够真正读懂系统资源状态,快速定位性能瓶颈。

1 top 命令详解

1.1 top 的基本运行原理

top是 Linux 下最常用的实时系统监控工具,它周期性地刷新显示系统进程和资源使用信息。理解top的运行机制有助于更好地使用它。

top默认每 3 秒刷新一次数据,可以通过-d参数调整刷新间隔。在交互式界面中,可以按s键输入新的刷新间隔,按q键退出。

top的数据来源主要是/proc文件系统。它读取/proc/stat获取 CPU 统计信息,读取/proc/meminfo获取内存信息,读取/proc/*/stat获取各个进程的 CPU 和内存使用情况。因此,top本身也是一个普通进程,它的资源消耗(尤其是 CPU)会计入系统统计。

top在启动时会尝试确定 CPU 核心数,并根据核心数决定默认的显示模式。在多核系统中,按1可以展开显示每个核心的单独使用率,这是排查 CPU 负载分布不均问题时的关键操作。

1.2 top 输出字段解析

执行top后,屏幕分为两部分:顶部是系统整体资源使用情况的汇总区,下方是进程列表。理解每个字段的含义是正确分析系统状态的前提。

1.2.1 汇总区字段说明

top顶部汇总区的典型输出如下:

top - 1415 up 45 days, 3:22, 2 users, load average: 1.25, 0.98, 0.85
Tasks: 287 total, 3 running, 284 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.3 us, 2.1 sy, 0.0 ni, 81.2 id, 1.2 wa, 0.0 hi, 0.2 si, 0.0 st
MiB Mem : 32768.0 total, 8192.4 free, 16384.0 used, 8191.6 buff/cache
MiB Swap: 8192.0 total, 8192.0 free, 0.0 used, 2097152.0 avail Mem

第一行显示系统运行时间和负载均值。up后面是系统运行时间(45 天 3 小时 22 分);load average后面三个数字分别表示 1 分钟、5 分钟、15 分钟的平均负载。负载均值表示系统中处于就绪状态(等待 CPU 或正在运行)的平均进程数量。在单核系统上,load average 为 1.0 表示 CPU 满负荷;在多核系统上,满负荷的 load average 等于 CPU 核心数。4 核 CPU 的 load average 为 4.0 表示 CPU 完全饱和。

理解负载均值需要结合 CPU 使用率一起看。如果 CPU 使用率很低但负载均值很高,说明进程可能在等待 I/O(磁盘或网络);如果 CPU 使用率很高且负载均值也很高,说明 CPU 是瓶颈。

第二行显示进程状态统计。total是进程总数;running是正在运行的进程数(包含正在使用 CPU 和等待 CPU 的进程);sleeping是处于睡眠状态的进程数(通常是等待事件);stopped是被暂停的进程数(收到 SIGSTOP 信号);zombie是僵尸进程数(已终止但父进程未回收)。

第三行是 CPU 使用率细分,这是排查 CPU 问题的核心数据。us(user space)是用户空间进程消耗的 CPU 时间百分比,是最常见的 CPU 使用来源;sy(system)是内核空间消耗的 CPU 时间,系统调用和内核内部操作会计入此处;ni(nice)是低优先级用户空间进程消耗的 CPU 时间;id(idle)是空闲时间,100% 表示 CPU 完全空闲;wa(wait)是 CPU 等待 I/O 完成的时间比例,如果这个值很高(比如超过 20%),说明进程在等待磁盘或网络 I/O;hi(hardware interrupt)是硬件中断处理消耗的 CPU 时间;si(software interrupt)是软件中断消耗的 CPU 时间;st(steal)是虚拟化环境中被其他虚拟机抢走的 CPU 时间。

第四行和第五行是内存统计。total是总内存;free是真正空闲的内存;used是已使用的内存;buff/cache是被 buffers 和 cache 占用的内存,它们会在应用程序需要时自动释放;avail Mem是可用的内存(包括已分配的 cache 可以释放的部分);Swap行显示交换分区使用情况,used 不为 0 说明物理内存不足。

1.2.2 进程列表字段说明

top默认按 CPU 使用率排序显示进程列表,每一行代表一个进程,主要字段包括:

PID是进程 ID,每个运行中的进程都有唯一的 PID。USER是进程所有者的用户名。PR是进程的调度优先级,rt 表示实时进程,数值越小优先级越高。NI是进程的 nice 值,范围是 -20 到 19,数值越小优先级越高。VIRT是进程使用的虚拟内存总量,包括代码、数据、共享库、已交换出去的内存等。RES是进程使用的物理内存(Resident Set Size),这是实际占用的 RAM 大小。SHR是进程使用的共享内存大小。S是进程状态:D=不可中断的睡眠,R=运行,S=睡眠,T=跟踪/暂停,Z=僵尸。

%CPU是进程使用的 CPU 百分比,在多核系统上,一个进程使用一个核心的 100% 会显示为 12.5%(8 核系统)。%MEM是进程使用的物理内存占总量的百分比。TIME+是进程累计使用的 CPU 时间,格式为分:秒。COMMAND是启动进程的命令名。

1.3 top 交互式操作

top提供了丰富的交互式操作,熟练使用这些快捷键可以大大提高排查效率:

按h或?显示帮助菜单。按q退出。按1展开或折叠 CPU 核心数显示。按s修改刷新间隔。按d修改刷新间隔(与 s 相同)。按z切换彩色显示,提高可读性。按x高亮排序列。按b高亮运行中的进程(running)。

按M按内存使用率排序。按P按 CPU 使用率排序(默认)。按T按累计 CPU 时间排序。按R反向排序(升序变降序)。

按u再输入用户名,只显示指定用户的进程。按i切换显示空闲进程。按n设置最大显示进程数。按c显示完整命令行(包括参数)。

按k再输入 PID,杀掉指定进程(需要确认)。按r重新设置进程优先级(renice)。

按W保存当前配置到~/.toprc,下次启动时自动应用。

1.4 top 的批量模式和脚本使用

在自动化监控脚本中,需要使用top的批量模式获取数据:

# 批量模式:执行一次后退出,每行一个进程
top -b -n 1

# 指定刷新次数和间隔
top -b -n 5 -d 1 > top_output.txt

# 只显示指定用户的进程
top -b -n 1 -u www-data

# 只显示指定 PID 的进程
top -b -n 1 -p 1234

# 输出指定的字段
top -b -n 1 -o %CPU -e

# 结合 head 提取汇总信息和前 20 个进程
top -b -n 1 -o %CPU | head -30

在脚本中提取特定字段需要使用awk:

# 获取当前 CPU 使用率
top -b -n 1 | grep"Cpu(s)"| awk'{print $2}'| cut -d'%'-f1

# 获取内存使用率
top -b -n 1 | grep"Mem"| awk'{print $3}'| cut -d'.'-f1

# 获取 top 5 CPU 占用进程
top -b -n 1 -o %CPU | head -12 | tail -6

# 获取指定进程的 CPU 和内存使用率
pid=1234
top -b -n 1 -p$pid| tail -1 | awk'{print $9, $10}'

1.5 top 的配置保存

top的显示配置可以通过交互式操作调整后保存:

# 在 top 交互界面中按 W 保存配置
# 配置文件位于 ~/.toprc

# 示例:查看现有配置
cat ~/.toprc

保存的配置包括刷新间隔、显示字段、排序方式等。下次启动top时会自动加载这些设置。

2 ps 命令详解

2.1 ps 命令的三种语法风格

ps命令支持三种不同的语法风格,这是很多初学者感到困惑的地方。POSIX 标准语法风格使用单个字母选项,前面加短横线;BSD 风格选项不需要短横线;GNU 长选项风格使用两个短横线。

三种风格可以混合使用,但需要注意兼容性:

# POSIX 风格
ps -eo pid,user,%cpu,%mem,comm

# BSD 风格(不需要短横线)
ps aux

# GNU 长选项风格
ps --pid 1234 --format pid,user,%cpu

ps aux是 BSD 风格最常用的组合:a显示所有终端上的进程(包括其他用户的进程);x显示没有控制终端的进程(守护进程);u显示面向用户的格式(包含用户名、CPU、内存等详细信息)。

2.2 ps 输出字段详解

ps aux的输出包含多个字段,每个字段都提供进程的重要信息:

ps aux
# USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMAND
# root   1234 0.1 0.5 123456 7890 ?    Ss  Jan15  2:34 /usr/sbin/sshd -D

USER是进程所有者的用户名。PID是进程 ID。%CPU是 CPU 使用百分比。%MEM是内存使用百分比(相对于物理内存)。VSZ是虚拟内存大小(单位 KB),包括所有映射的内存。RSS是实际使用的物理内存大小(Resident Set Size),不包括已交换出去的内存。TTY是进程关联的终端,?表示没有控制终端(通常是守护进程)。STAT或STATE是进程状态。START是进程启动时间。TIME是累计 CPU 时间。COMMAND是命令名或命令行。

2.3 ps 常用命令组合

ps命令的强大之处在于可以根据不同需求组合各种选项和过滤器:

# 查看所有进程,显示完整格式
ps -ef
ps aux

# 查看特定用户的进程
ps -u www-data
ps -u www-data -f

# 查看特定 PID 的进程
ps -p 1234
ps -p"1234 5678 9012"

# 查看特定命令的进程
ps -C nginx
ps -C nginx -f

# 查看进程的父子关系(进程树)
ps -ef --forest
ps aux --forest

# 查看命令的完整参数
ps -ef | grep nginx
ps -eo pid,args

# 查看特定进程的线程
ps -L -p 1234
ps -eLf | grep nginx

# 查看进程的文件描述符(需要 root)
ls -la /proc/1234/fd

# 查看进程的环境变量(需要 root)
cat /proc/1234/environ | tr'�''
'

2.4 ps 格式化输出

ps的-o选项允许自定义输出字段,这是编写监控脚本时的常用功能:

# 基本语法:-o field1,field2,...
ps -o pid,user,%cpu,%mem,etime,cmd

# 常用字段代码:
# pid   - 进程 ID
# user   - 用户名
# %cpu   - CPU 使用率
# %mem   - 内存使用率
# vsz   - 虚拟内存大小
# rss   - 物理内存大小
# pmem   - 内存使用百分比(精确)
# pcpu   - CPU 使用百分比(精确)
# etime  - 进程运行时间
# time   - 累计 CPU 时间
# cmd   - 命令(不带参数)
# args   - 命令(带完整参数)
# comm   - 命令名(不含路径)
# tty   - 控制终端
# stat   - 进程状态
# nice   - nice 值
# priority - 调度优先级

# 示例:自定义输出格式
ps -eo pid,user,comm,%cpu,%mem,etime,state

# 添加列标题
ps -eo pid,user,comm,%cpu,%mem,etime,state --headers

# 只显示指定字段
ps -eo pid,args --no-headers

2.5 ps 与其他命令的结合使用

在日常运维中,ps经常与其他命令结合使用来完成复杂查询:

# 查找 CPU 使用率最高的前 10 个进程
ps aux --sort=-%cpu | head -11

# 查找内存使用率最高的前 10 个进程
ps aux --sort=-%mem | head -11

# 查找特定用户的所有进程
ps -U www-data -u www-data u

# 查找僵尸进程
ps aux | grep Z

# 查找占用内存最多的 Java 进程
ps aux | grep java | sort -k4 -rn | head -5

# 统计某命令的进程数
ps -C nginx | wc -l
pgrep nginx | wc -l

# 查看进程的启动命令和环境
ps eww -p 1234

# 查找孤进程(父进程已终止)
ps -ef | awk'$3 == 1 {print}'

2.6 pgrep 和 pkill

pgrep和pkill是专门用于进程查找和管理的工具,是对ps的便捷封装:

# 查找匹配条件的进程 PID
pgrep nginx
pgrep -u www-data nginx

# 查找进程并显示详细信息
pgrep -a nginx

# 查找进程并显示完整命令行
pgrep -f"nginx -g daemon"

# 查找指定用户的进程数
pgrep -U www-data | wc -l

# 杀死匹配条件的进程(默认发送 SIGTERM)
pkill nginx

# 强制杀死匹配条件的进程
pkill -9 nginx

# 只杀死指定用户的进程
pkill -u www-data nginx

# 杀死匹配条件并显示被杀死的进程
pkill -ef"python script.py"

3 free 命令详解

3.1 free 的输出解读

free命令显示系统内存使用情况的汇总信息,是排查内存问题的首选工具:

free -h

输出示例:

       total    used    free   shared buff/cache  available
Mem:      32Gi    12.5Gi    8.2Gi    128Mi    11.3Gi    18.7Gi
Swap:     8.0Gi     0B     8.0Gi

total是物理内存的总容量。used是已使用的内存量。free是完全空闲的内存量。shared是被tmpfs文件系统使用的内存(通常很小)。buff/cache是被 buffers 和 cache 占用的内存,它们是内核用来缓存磁盘数据的,会在应用程序需要时自动释放。available是应用程序实际可以使用的内存(包括已分配的 cache 可以释放的部分),这是判断系统是否缺内存的最准确指标。

3.2 buffers 与 cache 的区别

理解 buffers 和 cache 的区别对于正确判断内存状态至关重要。

Cache(页面缓存)是内核为了加速文件读取而缓存的磁盘数据。当应用程序读取文件时,内核会把读取的数据缓存在 RAM 中,下次读取同一文件时可以直接从内存返回,避免磁盘 I/O。写入文件时,内核通常先写入 cache,然后异步刷回磁盘。Cache 包括 page cache、dentries、inodes 等。

Buffers(块设备缓存)是用于缓存原始磁盘块的内存,与具体文件无关,主要用于块设备(如磁盘)的元数据缓存。在现代 Linux 内核中,buffers 和 cache 的界限已经模糊,它们被统一管理在buff/cache这一项中。

关键理解:buffers 和 cache 占用的内存不是"丢失"的内存,而是内核为了提高 I/O 性能而主动使用的缓存。当应用程序需要更多内存时,内核会自动释放这些缓存,将内存分配给应用程序。这个过程不需要人工干预,也不应该通过人工释放 cache 来"解决"内存问题。

3.3 free 命令的选项

# 以人类可读的格式显示(自动选择 KB/MB/GB)
free -h

# 以字节为单位显示
free -b

# 以 KB 为单位显示
free -k

# 以 MB 为单位显示
free -m

# 以 GB 为单位显示
free -g

# 显示低内存和高内存的统计(废弃选项,仅保留兼容性)
free -l

# 持续显示,每隔 N 秒刷新一次
free -s 5
free -s 5 -c 10 # 刷新 10 次后退出

# 显示总计行
free -t

# 不显示缓存行
free -o

3.4 理解 available 与 free 的区别

available是MemAvailable的值,这是内核 3.14 版本引入的字段,它更准确地反映了应用程序实际可用的内存数量。free只是完全空闲的内存,但available包含了可以被释放的 cache。

例如,一个 32GB 内存的系统,free显示 8GB,buff/cache显示 11GB。表面上看 free 只有 8GB,但实际上应用程序还可以使用约 18.7GB(free + 可释放的 cache)。如果仅看free字段判断内存够不够用,会得出错误的结论。

3.5 交换空间(Swap)监控

Swap 的使用情况是判断物理内存是否充足的重要指标:

# 查看 swap 使用情况
free -h
swapon -s

# 查看详细的 swap 使用
cat /proc/swaps

# 关闭所有 swap(不推荐,可能导致 OOM)
swapoff -a

# 开启所有 swap
swapon -a

# 查看哪个进程使用了 swap
forfin/proc/*/status;doawk'/VmSwap/{s+=$2}/Name/{n=$2}END{if(s>0)print n,s}'$f;done| sort -k2 -rn | head

正常的 Swap 使用应该是 0 或接近 0。如果 Swap 使用量持续很高(比如几 GB),说明物理内存不足,操作系统在把不活跃的内存页交换到磁盘,这会严重影响性能。

如果发现系统频繁使用 swap,应该:检查是否有内存泄漏的进程;调整应用程序的内存使用配置;增加物理内存;优化应用程序的内存使用。

3.6 /proc/meminfo 详解

free命令的数据来源是/proc/meminfo,深入理解这个文件可以更好地理解内存管理:

cat /proc/meminfo

关键字段说明:

MemTotal是可用的物理内存总量。MemFree是完全空闲的内存。MemAvailable是应用程序可用的内存估计值。Buffers是用于块设备元数据的内存。Cached是用于文件内容缓存的内存。SwapCached是已经存在于 swap 空间但被换入到内存的页面(避免二次 I/O)。Active是活跃的内存(最近使用过且不立即释放)。Inactive是不活跃的内存(可以被回收)。Shmem是共享内存(tmpfs)。SReclaimable是可回收的 slab 内存。SUnreclaim是不可回收的 slab 内存。Mlocked是被mlock()锁定的内存。

判断内存是否紧缺应该看MemAvailable而不是MemFree。判断是否需要增加内存应该看 swap 使用情况和ActivevsInactive的比例。

4 综合排查场景

4.1 场景一:CPU 使用率高排查

当发现 CPU 使用率持续很高时,按以下步骤排查:

第一步,确认是全局 CPU 高还是某个核心高:

# 展开查看每个核心的使用率
top
# 按 1

如果只有一两个核心高,说明是单线程程序瓶颈;如果所有核心都高,说明是多个进程或整体负载高。

第二步,确认是用户空间还是内核空间消耗高:

# 查看 CPU 使用率细分
top
# 查看 us(用户空间)和 sy(系统空间)的比例

us高通常是应用程序的计算负载高;sy高通常是系统调用频繁或 I/O 操作多。

第三步,找到消耗 CPU 的具体进程:

# 按 CPU 使用率排序
ps aux --sort=-%cpu | head -20

# 查看具体进程的线程
ps -p $(pgrep -f nginx) -L -o pid,tid,%cpu,cmd

第四步,分析进程行为:

# 查看进程的打开文件
ls -la /proc/1234/fd

# 查看进程的 syscall
strace -p 1234 2>&1 | head -50

# 查看进程的堆栈
pstack 1234

4.2 场景二:内存使用率高排查

当发现内存使用率持续很高时:

第一步,确认是进程使用还是 cache 使用:

free -h
# 查看 buff/cache 是否很高

如果buff/cache很高但available仍然充足,说明只是缓存,不算真正的内存紧缺。

第二步,找到消耗内存的具体进程:

# 按内存使用率排序
ps aux --sort=-%mem | head -20

# 查看进程详细信息
ps -eo pid,user,%mem,%cpu,vsz,rss,cmd --sort=-%mem | head -20

第三步,分析进程的内存使用:

# 查看进程的内存映射
pmap -x 1234

# 查看进程的详细内存状态
cat /proc/1234/status | grep -E"Vm|Rss|Pid"

4.3 场景三:Java 进程内存问题排查

Java 进程(Tomcat、Spring Boot 等)有特殊的内存模型,需要专门分析:

# 查看 Java 进程的内存使用(RSS)
ps aux | grep java

# 查看 JVM 堆内存使用(需要 jstat 或 jcmd)
jstat -gc 1234

# 查看 JVM 内存池
jcmd 1234 GC.heap_info

# 分析 heap dump(需要先生成 dump)
jmap -dump:format=b,file=heap.bin 1234

4.4 场景四:进程僵死(hung)排查

当进程不响应请求但不消耗 CPU 时:

# 查看进程状态
ps -eo pid,stat,args --sort=stat| grep D

# 查看 D 状态进程(不可中断的睡眠)
ps aux | awk'$8~/D/ {print}'

# 查看进程的等待事件
cat /proc/1234/wchan

# 查看进程的堆栈
cat /proc/1234/stack

D 状态(Uninterruptible Sleep)通常表示进程在等待 I/O(磁盘、网络)或内核事件。这种状态不应该持续很久,如果持续很久(比如几分钟),可能是 I/O 子系统出了问题。

4.5 场景五:僵尸进程排查

僵尸进程是已终止但父进程未回收的进程:

# 查找僵尸进程
ps aux | awk'$8=="Z" {print}'

# 查看僵尸进程的父进程
ps -ef | awk'$3==1234 {print}'# 1234 是僵尸进程的 PID

# 找到所有僵尸进程及其父进程
ps -eo pid,stat,ppid,args | awk'$2~/Z/ {print}'

# 杀死僵尸进程的父进程(谨慎操作)
kill-9 <父进程PID>

僵尸进程本身不消耗资源(已释放所有内存),但会占用 PID 和进程表空间。如果系统中有很多僵尸进程,可能是应用程序有 bug 导致父进程没有正确调用wait()回收子进程。

5 自动化监控脚本示例

5.1 系统资源监控脚本

#!/bin/bash
# system_monitor.sh - 系统资源监控脚本

LOG_DIR="/var/log/monitor"
DATE=$(date +%Y%m%d)
LOG_FILE="${LOG_DIR}/monitor_${DATE}.log"

# 创建日志目录
mkdir -p$LOG_DIR

# 记录时间戳
echo"=== System Monitor Report:$(date)===">>$LOG_FILE

# CPU 使用情况
echo"">>$LOG_FILE
echo"--- CPU ---">>$LOG_FILE
top -bn1 | grep"Cpu(s)">>$LOG_FILE
echo"Top 5 CPU processes:">>$LOG_FILE
ps aux --sort=-%cpu | head -6 >>$LOG_FILE

# 内存使用情况
echo"">>$LOG_FILE
echo"--- Memory ---">>$LOG_FILE
free -h >>$LOG_FILE
echo"Top 5 Memory processes:">>$LOG_FILE
ps aux --sort=-%mem | head -6 >>$LOG_FILE

# 磁盘 I/O 情况
echo"">>$LOG_FILE
echo"--- Disk I/O ---">>$LOG_FILE
iostat -x 1 1 2>/dev/null >>$LOG_FILE||echo"iostat not available">>$LOG_FILE

# 网络连接情况
echo"">>$LOG_FILE
echo"--- Network Connections ---">>$LOG_FILE
netstat -an | awk'/^tcp/ {s[$NF]++} END {for(k in s) print k, s[k]}'>>$LOG_FILE

# Load Average
echo"">>$LOG_FILE
echo"--- Load Average ---">>$LOG_FILE
uptime >>$LOG_FILE

echo"Log saved to:$LOG_FILE"

5.2 告警脚本

#!/bin/bash
# alert.sh - 资源告警脚本

# 告警阈值
CPU_THRESHOLD=80
MEM_THRESHOLD=85
DISK_THRESHOLD=90

# 检查 CPU
CPU_USAGE=$(top -bn1 | grep"Cpu(s)"| awk'{print $2}'| cut -d'%'-f1)
if(( $(echo"$CPU_USAGE>$CPU_THRESHOLD"| bc -l) ));then
 echo"ALERT: CPU usage is${CPU_USAGE}% (threshold:${CPU_THRESHOLD}%)"
fi

# 检查内存
MEM_USAGE=$(free | grep Mem | awk'{printf "%.0f", $3/$2 * 100}')
if["$MEM_USAGE"-gt"$MEM_THRESHOLD"];then
 echo"ALERT: Memory usage is${MEM_USAGE}% (threshold:${MEM_THRESHOLD}%)"
fi

# 检查磁盘
DISK_USAGE=$(df -h / | awk'NR==2 {print $5}'| cut -d'%'-f1)
if["$DISK_USAGE"-gt"$DISK_THRESHOLD"];then
 echo"ALERT: Disk usage is${DISK_USAGE}% (threshold:${DISK_THRESHOLD}%)"
fi

# 检查 swap
SWAP_USED=$(free | grep Swap | awk'{print $3}')
if["$SWAP_USED"-gt 0 ];then
 echo"WARNING: Swap is being used (${SWAP_USED}KB)"
fi

5.3 进程分析脚本

#!/bin/bash
# process_analyzer.sh - 进程资源分析脚本

TARGET_PID=$1

if[ -z"$TARGET_PID"];then
 echo"Usage:$0"
 exit1
fi

if[ ! -d"/proc/$TARGET_PID"];then
 echo"Process$TARGET_PIDnot found"
 exit1
fi

echo"=== Process Analysis: PID$TARGET_PID==="

# 基本信息
echo""
echo"--- Basic Info ---"
ps -p$TARGET_PID-o pid,ppid,user,%cpu,%mem,time,cmd

# 内存详情
echo""
echo"--- Memory Details ---"
pmap -x$TARGET_PID| tail -1

# 线程数
echo""
echo"--- Thread Count ---"
ps -p$TARGET_PID-o nlwp

# 打开的文件描述符
echo""
echo"--- Open Files Count ---"
ls /proc/$TARGET_PID/fd 2>/dev/null | wc -l

# 环境变量(部分)
echo""
echo"--- Key Environment Variables ---"
cat /proc/$TARGET_PID/environ 2>/dev/null | tr'�''
'| grep -E"HOME|PATH|JAVA_HOME|NGINX"| head -10

# 内存映射
echo""
echo"--- Memory Mappings ---"
cat /proc/$TARGET_PID/maps | awk'{print $6}'| sort -u | head -20

6 结论

top、ps、free是 Linux 运维工程师最常用的三个监控命令,每个命令都有其特定的使用场景和优势。top适合实时监控和交互式分析,可以持续观察系统状态的变化;ps适合获取特定时刻的进程快照,便于脚本化和精确查找;free适合分析内存使用状况。

理解这些命令输出字段的含义是正确判断系统状态的前提。特别需要注意:top和ps的 CPU 使用率是采样瞬间的值,不完全等同于 CPU 的平均使用率;free的buff/cache不是"浪费"的内存,而是内核主动管理的缓存;available是判断应用程序可用内存的最准确指标,而不是free。

实际排查中,应该综合使用这三个命令,结合/proc文件系统提供的信息,形成对系统状态的完整判断。养成良好的监控和分析习惯,才能在系统出现问题时快速定位根因。

参考资料:

man top

man ps

man free

/proc/meminfo文档

man proc(proc 文件系统说明)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11324

    浏览量

    225836
  • Linux
    +关注

    关注

    88

    文章

    11810

    浏览量

    219513
  • 命令
    +关注

    关注

    5

    文章

    759

    浏览量

    23916

原文标题:运维每天都在用的 top、ps、free,到底该怎么看?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux如何使用less、more和most命令

    Linux 系统上有许多 GUI 文本编辑器可用于查看和修改文本文件。但如果您只想在终端读取文本文件。那么 Linux 上有许多可用的
    发表于 12-05 09:22 2230次阅读

    请问这三个make命令有什么区别

    =arm-linux-或make),请问这三个make命令有什么区别,到底该用哪一,实质是什么?U-Boot的编译过程以下命令都在U-Bo
    发表于 07-16 05:10

    非常高效三个linux shell命令分享

    了开发效率。本文浅析三个非常高效的linux shell命令(awk,grep,sed),在开发工程的实际应用。1,从系统
    发表于 12-23 06:38

    你知道linux常用查看硬件设备信息命令方法是什么?

    你知道linux常用查看硬件设备信息命令方法是什么?
    发表于 05-13 11:04 3574次阅读

    简述Linux文本查看命令

    Linux 常用命令,除了 cat 还有很多其他用于文本查看命令
    的头像 发表于 08-11 11:17 5186次阅读

    Linux服务的内容如何查看

     ps是进程查看命令,netstat是端口查看命令,在Linux系统
    发表于 05-20 09:09 1166次阅读
    <b class='flag-5'>Linux</b>服务的内容如何<b class='flag-5'>查看</b>

    通过串口命令查看EMMC擦写次数的方法

    通过串口命令查看EMMC擦写次数的方法
    的头像 发表于 06-19 10:34 1.5w次阅读
    通过串口<b class='flag-5'>命令</b><b class='flag-5'>查看</b>EMMC擦写次数的<b class='flag-5'>三</b>大<b class='flag-5'>方法</b>

    9Linux查看系统硬件信息的实用命令

    Linux下,我们经常需要查看系统的硬件信息, 这里我罗列了查看系统硬件信息的实用命令,并做了
    的头像 发表于 04-25 14:46 4814次阅读
    9<b class='flag-5'>个</b><b class='flag-5'>Linux</b><b class='flag-5'>中</b><b class='flag-5'>查看</b><b class='flag-5'>系统</b>硬件信息的实用<b class='flag-5'>命令</b>

    Linux系统的10常用的文本查看命令

    当你需要查看Linux系统的文本文件时,使用文本编辑器可能会比较繁琐,特别是当你只需要查看文件的内容时。这时,你可以使用
    的头像 发表于 06-24 11:44 1.2w次阅读

    linux系统查看ip地址命令

    Linux系统,可以使用ifconfig命令查看IP地址。ifconfig命令被用于配置和
    的头像 发表于 11-08 15:09 5644次阅读

    linux查看物理接口的命令

    Linux操作系统提供了多种命令和工具来查看物理接口。在这篇文章,我们将详细介绍一些最常用和常见的命令
    的头像 发表于 11-16 16:48 2715次阅读

    恒流LED总爱被“烧掉”?用这三个方法,能让它更“长寿”!

    恒流LED总爱被“烧掉”?用这三个方法,能让它更“长寿”!
    的头像 发表于 11-23 09:08 1814次阅读

    linux关机的三个命令

    Linux系统,常用的关机命令三个:shutdown、poweroff和halt。下面是对这三个
    的头像 发表于 11-26 15:33 6221次阅读

    自动发电控制系统具有三个基本功能

    自动发电控制系统(AGC)具有三个基本功能,这些功能在电力系统的运行和调度中发挥着重要作用。以下是这三个
    的头像 发表于 10-03 15:05 2853次阅读

    Linux系统中最重要的三个命令

    Linux剑客是Linux系统中最重要的三个命令,它们以其强大的
    的头像 发表于 03-03 10:37 1181次阅读