top [选项]
| 选项 | 说明 |
|---|---|
-d 秒数 |
设置刷新间隔时间(默认3秒) |
-n 次数 |
刷新指定次数后退出 |
-p PID |
仅监控指定PID的进程 |
-u 用户名 |
仅监控指定用户的进程 |
-c |
显示完整的命令行 |
-H |
显示线程信息 |
-b |
批处理模式,输出到文件 |
-i |
不显示闲置或僵死进程 |
-o 字段 |
指定排序字段 |
--help |
显示帮助信息 |
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 | 交换空间使用情况 |
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) |
NI | nice值,负值表示高优先级 |
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 |
启动top命令:
top
设置刷新间隔为2秒:
top -d 2
显示完整命令行:
top -c
只监控指定PID的进程:
# 监控PID为1234的进程
top -p 1234
# 监控多个进程
top -p 1234,5678,9012
# 监控一个进程及其所有线程
top -Hp 1234
监控特定用户的所有进程:
# 监控root用户的进程
top -u root
# 监控www-data用户的进程
top -u www-data
将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
启动时按特定字段排序:
# 按内存使用率排序
top -o %MEM
# 按CPU使用率排序(默认)
top -o %CPU
# 按进程运行时间排序
top -o TIME+
# 按PID排序
top -o PID
组合多个选项使用:
# 监控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
实时监控系统性能并记录日志:
#!/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
使用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
自动化监控关键指标并发送告警:
#!/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(系统负载)表示系统在特定时间间隔内的平均活跃进程数:
如何解读:
示例:如果系统有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 键
top 命令方法2:使用命令行
# 先找到进程PID
top -b -n 1 | grep process_name
# 优雅终止(推荐先尝试)
kill PID
kill -15 PID
# 强制终止
kill -9 PID
安全终止的最佳实践:
kill PID 或 kill -15 PIDkill -9 PIDtop(传统版本):
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批处理模式top查看系统状态top -b模式收集数据~/.toprcps、vmstat等工具进行深入分析#!/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 "监控报告已保存"