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

描述

背景与问题

在 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
for f in /proc/*/status; do awk '/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 使用情况和 Active vs Inactive 的比例。

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 "
    exit 1
fi

if [ ! -d "/proc/$TARGET_PID" ]; then
    echo "Process $TARGET_PID not found"
    exit 1
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 文件系统说明)

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分