Linux top 命令

top 命令是Linux系统中最强大的实时进程监控工具,可以动态显示系统资源使用情况和进程信息

语法格式

top [选项]

常用启动选项

选项 说明
-d 秒数 设置刷新间隔时间(默认3秒)
-n 次数 刷新指定次数后退出
-p PID 仅监控指定PID的进程
-u 用户名 仅监控指定用户的进程
-c 显示完整的命令行
-H 显示线程信息
-b 批处理模式,输出到文件
-i 不显示闲置或僵死进程
-o 字段 指定排序字段
--help 显示帮助信息

top界面详解

顶部系统信息区(Summary Area)
top - 09:30:45 up 5 days,  3:25,  3 users,  load average: 0.12, 0.08, 0.05
Tasks: 256 total,   1 running, 255 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.6 us,  2.3 sy,  0.0 ni, 91.7 id,  0.4 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  16032.4 total,   4776.2 free,   3256.8 used,   7999.4 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.  12543.4 avail Mem
字段说明
top - 09:30:45当前时间和程序名称
up 5 days, 3:25系统运行时间
3 users当前登录用户数
load average系统1、5、15分钟平均负载
Tasks进程统计(总数、运行、睡眠、停止、僵尸)
%Cpu(s)CPU使用率(用户、系统、优先级、空闲、I/O等待等)
MiB Mem物理内存使用情况
MiB Swap交换空间使用情况
进程信息区(Process Area)
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 root      20   0  123456   7890   1234 R   5.6   0.1   0:10.23 Xorg
 2345 mysql     20   0  2345678 456789 123456 S   3.4   2.8  45:23.12 mysqld
 3456 www-data  20   0   567890  23456   7890 S   2.1   0.2   2:34.56 nginx
字段说明
PID进程ID
USER进程所有者
PR优先级(Priority)
NInice值,负值表示高优先级
VIRT进程使用的虚拟内存总量
RES进程使用的物理内存大小
SHR进程使用的共享内存大小
S进程状态(R=运行,S=睡眠,Z=僵尸等)
%CPU进程的CPU使用率
%MEM进程的物理内存使用率
TIME+进程使用的CPU时间总计
COMMAND进程名称(命令行)

交互式命令(运行中按键)

按键 功能 说明
h? 显示帮助 查看所有可用命令
q 退出top 返回到命令行
空格 立即刷新 立即更新显示
k 终止进程 输入PID和信号(默认15)
r 调整优先级 调整进程的nice值
P 按CPU使用率排序 大写P,默认排序方式
M 按内存使用率排序 大写M
N 按PID排序 大写N
T 按运行时间排序 大写T
1 显示所有CPU核心 切换CPU显示模式
z 彩色/黑白显示 切换颜色显示
c 显示完整命令 切换命令显示模式
H 显示线程 切换线程显示模式
u 按用户筛选 仅显示指定用户的进程
f 字段管理 选择显示的字段
o 过滤显示 按条件过滤进程
W 保存设置 将当前配置保存到~/.toprc

命令示例

示例1:基本使用

启动top命令:

top

设置刷新间隔为2秒:

top -d 2

显示完整命令行:

top -c
示例2:监控特定进程

只监控指定PID的进程:

# 监控PID为1234的进程
top -p 1234

# 监控多个进程
top -p 1234,5678,9012

# 监控一个进程及其所有线程
top -Hp 1234

监控特定用户的所有进程:

# 监控root用户的进程
top -u root

# 监控www-data用户的进程
top -u www-data
示例3:批处理模式

将top输出保存到文件,用于后续分析:

# 运行5次后退出,输出到文件
top -b -n 5 > top_output.txt

# 监控特定进程并保存日志
top -b -p 1234 -n 10 > process_monitor.log

# 连续监控并追加到文件
top -b -d 2 >> continuous_monitor.log
示例4:使用自定义排序

启动时按特定字段排序:

# 按内存使用率排序
top -o %MEM

# 按CPU使用率排序(默认)
top -o %CPU

# 按进程运行时间排序
top -o TIME+

# 按PID排序
top -o PID
注意:在top运行中也可以按相应的大写字母键(如M、P、T)进行排序
示例5:组合使用

组合多个选项使用:

# 监控nginx进程,显示线程,每1秒刷新
top -H -d 1 -p $(pidof nginx)

# 监控特定用户,显示完整命令,按内存排序
top -u mysql -c -o %MEM

# 批处理模式输出前20个进程
top -b -n 1 | head -30 > top_snapshot.txt

实际应用场景

场景1:系统性能监控

实时监控系统性能并记录日志:

#!/bin/bash
# 系统性能监控脚本

LOG_DIR="/var/log/top_monitor"
mkdir -p $LOG_DIR

while true; do
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    LOG_FILE="$LOG_DIR/top_${TIMESTAMP}.log"

    # 运行top 5次,每次间隔2秒
    echo "=== 系统监控报告 $(date) ===" > $LOG_FILE
    echo "" >> $LOG_FILE

    # 收集系统概览
    top -b -n 1 | head -20 >> $LOG_FILE
    echo "" >> $LOG_FILE

    # 收集进程详情(按CPU排序)
    echo "=== CPU使用率最高的10个进程 ===" >> $LOG_FILE
    top -b -n 1 -o %CPU | head -30 >> $LOG_FILE
    echo "" >> $LOG_FILE

    # 收集进程详情(按内存排序)
    echo "=== 内存使用率最高的10个进程 ===" >> $LOG_FILE
    top -b -n 1 -o %MEM | head -30 >> $LOG_FILE

    echo "监控数据已保存到: $LOG_FILE"
    sleep 300  # 每5分钟收集一次
done
场景2:故障排查和问题诊断

使用top诊断系统问题:

#!/bin/bash
# 系统问题诊断脚本

echo "=== 系统问题诊断报告 $(date) ==="
echo ""

# 1. 检查系统负载
echo "1. 系统负载检查:"
top -b -n 1 | grep "load average"
LOAD15=$(top -b -n 1 | grep "load average" | awk '{print $NF}')
if (( $(echo "$LOAD15 > 5.0" | bc -l) )); then
    echo "警告:15分钟负载过高 ($LOAD15)"
fi
echo ""

# 2. 检查CPU使用率
echo "2. CPU使用率检查:"
top -b -n 1 | grep "%Cpu"
CPU_IDLE=$(top -b -n 1 | grep "%Cpu" | awk '{print $8}')
if (( $(echo "$CPU_IDLE < 10.0" | bc -l) )); then
    echo "警告:CPU空闲率过低 ($CPU_IDLE%)"
fi
echo ""

# 3. 检查内存使用
echo "3. 内存使用检查:"
top -b -n 1 | grep "MiB Mem"
MEM_FREE=$(top -b -n 1 | grep "MiB Mem" | awk '{print $6}')
MEM_TOTAL=$(top -b -n 1 | grep "MiB Mem" | awk '{print $4}')
MEM_USAGE=$(( (MEM_TOTAL - MEM_FREE) * 100 / MEM_TOTAL ))
if [ $MEM_USAGE -gt 90 ]; then
    echo "警告:内存使用率过高 ($MEM_USAGE%)"
fi
echo ""

# 4. 检查僵尸进程
echo "4. 僵尸进程检查:"
ZOMBIE_COUNT=$(top -b -n 1 | grep "Tasks" | awk '{print $10}')
if [ "$ZOMBIE_COUNT" -gt 0 ]; then
    echo "警告:发现 $ZOMBIE_COUNT 个僵尸进程"
fi
echo ""

# 5. 检查高资源进程
echo "5. 高资源进程检查:"
echo "CPU使用率 > 50% 的进程:"
top -b -n 1 | awk '$9 > 50 && NR > 7 {print $0}' | head -5
场景3:自动化监控和告警

自动化监控关键指标并发送告警:

#!/bin/bash
# 自动化监控告警脚本

# 监控阈值
CPU_THRESHOLD=80     # CPU使用率阈值
MEM_THRESHOLD=90     # 内存使用率阈值
LOAD_THRESHOLD=5.0   # 负载阈值
CHECK_INTERVAL=60    # 检查间隔(秒)

while true; do
    # 获取系统状态
    TOP_OUTPUT=$(top -b -n 1)

    # 解析CPU使用率
    CPU_USAGE=$(echo "$TOP_OUTPUT" | grep "%Cpu" | awk '{print 100 - $8}')

    # 解析内存使用率
    MEM_TOTAL=$(echo "$TOP_OUTPUT" | grep "MiB Mem" | awk '{print $4}')
    MEM_FREE=$(echo "$TOP_OUTPUT" | grep "MiB Mem" | awk '{print $6}')
    MEM_USAGE=$(( (MEM_TOTAL - MEM_FREE) * 100 / MEM_TOTAL ))

    # 解析系统负载
    LOAD15=$(echo "$TOP_OUTPUT" | grep "load average" | awk '{print $NF}' | tr -d ',')

    # 检查并发送告警
    ALERT_MESSAGE=""

    if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
        ALERT_MESSAGE+="CPU使用率过高: ${CPU_USAGE}%\n"
    fi

    if [ $MEM_USAGE -gt $MEM_THRESHOLD ]; then
        ALERT_MESSAGE+="内存使用率过高: ${MEM_USAGE}%\n"
    fi

    if (( $(echo "$LOAD15 > $LOAD_THRESHOLD" | bc -l) )); then
        ALERT_MESSAGE+="系统负载过高: ${LOAD15}\n"
    fi

    # 如果有告警,发送通知
    if [ -n "$ALERT_MESSAGE" ]; then
        echo "=== 系统告警 $(date) ==="
        echo -e "$ALERT_MESSAGE"
        echo "详情:"
        echo "$TOP_OUTPUT" | head -20

        # 这里可以添加发送邮件、短信等通知代码
        # send_alert "$ALERT_MESSAGE"
    fi

    sleep $CHECK_INTERVAL
done

相关命令对比

命令 功能 特点 适用场景
top 实时进程监控 系统自带,功能全面,交互式操作 实时监控、交互式分析
htop 增强版top 彩色界面,鼠标支持,更易用 交互式监控,需要更好用户体验
atop 高级系统监控 记录历史数据,更详细统计 性能分析和历史追踪
glances 跨平台监控 Web界面,支持远程监控 远程监控和Web界面需求
vmstat 虚拟内存统计 专注于内存和CPU统计 内存和CPU详细分析
ps 进程快照 静态查看,适合脚本处理 脚本处理,一次性查看

常见问题解答

load average(系统负载)表示系统在特定时间间隔内的平均活跃进程数:

  • 第一个数字:1分钟平均负载
  • 第二个数字:5分钟平均负载
  • 第三个数字:15分钟平均负载

如何解读:

  • 0.00 - 1.00:系统空闲
  • 1.00 - CPU核心数:系统忙碌,但可以处理
  • > CPU核心数:系统过载,有进程在等待

示例:如果系统有4个CPU核心:

load average: 0.12, 0.08, 0.05  # 系统非常空闲
load average: 2.50, 1.80, 1.20   # 系统适中负载
load average: 8.00, 6.50, 5.00   # 系统严重过载

检查CPU核心数:

nproc        # 显示CPU核心数
lscpu | grep "^CPU(s)"  # 显示详细信息

有多种方法查看进程的完整命令行:

方法1:启动时使用 -c 选项

top -c

方法2:在top运行中按 c

启动top后,按c键可以在完整命令和命令名之间切换。

方法3:使用其他命令

# 使用ps查看完整命令
ps -ef | grep process_name
ps aux | grep process_name

# 查看/proc文件
cat /proc/PID/cmdline | tr '\0' ' '
cat /proc/PID/comm

示例:

# 查看nginx的完整配置
top -c -p $(pidof nginx)

# 或者先启动top,然后:
# 1. 按 c 键显示完整命令
# 2. 按 k 键终止进程
# 3. 按 q 键退出

在top中安全终止进程的步骤:

方法1:使用 k

  1. 运行 top 命令
  2. k
  3. 输入要终止的进程PID
  4. 输入信号编号(默认15=SIGTERM,推荐先尝试)
  5. 如果进程不响应,可以输入9(SIGKILL)强制终止

方法2:使用命令行

# 先找到进程PID
top -b -n 1 | grep process_name

# 优雅终止(推荐先尝试)
kill PID
kill -15 PID

# 强制终止
kill -9 PID

安全终止的最佳实践:

  1. 先尝试正常终止:kill PIDkill -15 PID
  2. 等待几秒,如果进程还在,再强制终止:kill -9 PID
  3. 在top中可以先按r键调整优先级,降低后再终止
  4. 终止后按空格键刷新显示
警告:强制终止(kill -9)可能导致数据丢失,只在必要时使用。

top(传统版本):

  • 优点:所有Linux系统默认安装,无需额外安装;资源占用少;功能成熟稳定
  • 缺点:界面简单,不支持鼠标操作;配置相对复杂
  • 适用:服务器环境,特别是没有GUI的环境;资源有限的系统

htop(增强版本):

  • 优点:彩色界面,更易阅读;支持鼠标点击操作;垂直和水平滚动;树状视图显示进程关系
  • 缺点:需要额外安装;资源占用稍多
  • 适用:桌面环境;需要更好用户体验的场景;需要更直观的进程管理

安装htop:

# Debian/Ubuntu
sudo apt install htop

# RHEL/CentOS
sudo yum install htop

# Fedora
sudo dnf install htop

# Arch Linux
sudo pacman -S htop

选择建议:

  • 服务器管理:优先使用top(兼容性更好)
  • 桌面使用:推荐使用htop(用户体验更好)
  • 脚本处理:使用top -b批处理模式
  • 远程SSH:都可以,取决于个人习惯

最佳实践

  1. 定期监控:建立定期检查系统性能的习惯,使用top查看系统状态
  2. 了解关键指标:掌握CPU使用率、内存使用率、系统负载等关键指标的含义
  3. 设置合理阈值:根据系统配置设置合理的监控阈值
  4. 使用批处理模式:在脚本中使用top -b模式收集数据
  5. 保存配置文件:使用W键保存个人配置到~/.toprc
  6. 结合其他工具:top适合实时监控,结合psvmstat等工具进行深入分析
  7. 安全终止进程:先尝试正常终止(SIGTERM),再考虑强制终止(SIGKILL)
  8. 记录历史数据:定期保存top输出,便于历史分析和趋势预测
#!/bin/bash
# top最佳实践示例脚本

# 1. 保存当前top配置
echo "保存当前top配置到 ~/.toprc"
top -n 1 -b > /tmp/top_temp.txt
# 调整配置后按W保存

# 2. 创建每日监控报告
DAILY_REPORT="/var/log/top_daily_$(date +%Y%m%d).log"
echo "创建每日监控报告: $DAILY_REPORT"

# 3. 定义监控函数
monitor_system() {
    echo "=== $(date) ==="
    echo ""

    # 系统概览
    echo "系统概览:"
    top -b -n 1 | head -5
    echo ""

    # CPU使用最高的进程
    echo "CPU使用最高的5个进程:"
    top -b -n 1 -o %CPU | head -12 | tail -5
    echo ""

    # 内存使用最高的进程
    echo "内存使用最高的5个进程:"
    top -b -n 1 -o %MEM | head -12 | tail -5
    echo ""
}

# 4. 执行监控
monitor_system >> $DAILY_REPORT
echo "监控报告已保存"