uptime 是Linux系统中用于显示系统运行时间的命令。它会输出一行信息,包含当前时间、系统运行时间、登录用户数以及过去1分钟、5分钟和15分钟的系统平均负载。这个命令对于系统管理员监控服务器状态非常有用。
uptime [选项]
| 选项 | 说明 |
|---|---|
-p, --pretty |
以友好的格式显示运行时间(如 "2 hours, 30 minutes") |
-s, --since |
显示系统启动时间(格式:YYYY-MM-DD HH:MM:SS) |
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
--help |
显示完整的帮助信息 |
uptime命令的典型输出格式如下:
# uptime
17:35:42 up 25 days, 3:12, 2 users, load average: 0.05, 0.10, 0.15
| 部分 | 说明 | 示例值 |
|---|---|---|
| 当前时间 | 系统当前的时间(24小时制) | 17:35:42 |
| 运行时间 | 系统自上次启动以来运行的时间 | up 25 days, 3:12(运行25天3小时12分钟) |
| 登录用户数 | 当前登录系统的用户数量 | 2 users |
| 平均负载 | 过去1分钟、5分钟和15分钟的系统平均负载 | load average: 0.05, 0.10, 0.15 |
系统平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。它反映了系统的繁忙程度。
对于单核CPU系统,负载1.00表示CPU完全被占用;对于多核CPU系统,需要将负载除以CPU核心数来判断。
| 负载值范围 | 单核CPU | 4核CPU | 说明 |
|---|---|---|---|
| 0.00 - 0.70 | 正常 | 正常 | 系统空闲或轻度使用 |
| 0.70 - 1.00 | 警戒 | 正常 | 系统开始有压力,需要关注 |
| 1.00 - 5.00+ | 过载 | 警戒到过载 | 系统过载,性能下降 |
查看系统运行时间和负载:
# 基本用法
uptime
# 示例输出:
# 17:35:42 up 25 days, 3:12, 2 users, load average: 0.05, 0.10, 0.15
以更易读的格式显示运行时间:
# 使用-p选项
uptime -p
# 示例输出:
# up 25 days, 3 hours, 12 minutes
# 与基本输出结合
uptime -p && uptime
# 输出:
# up 25 days, 3 hours, 12 minutes
# 17:35:42 up 25 days, 3:12, 2 users, load average: 0.05, 0.10, 0.15
查看系统是何时启动的:
# 显示系统启动时间
uptime -s
# 示例输出:
# 2024-01-15 14:23:30
# 使用date命令验证
date
# 计算运行时间
start_time=$(uptime -s)
current_time=$(date '+%Y-%m-%d %H:%M:%S')
echo "系统启动时间: $start_time"
echo "当前时间: $current_time"
使用watch命令持续监控系统负载:
# 每2秒更新一次uptime信息
watch -n 2 uptime
# 每5秒更新,高亮显示负载超过1.0的情况
watch -n 5 -d uptime
# 使用彩色输出监控
watch -n 1 -c 'uptime | grep -o "load average:.*"'
# 结合其他信息一起监控
watch -n 1 'echo -n "当前时间: "; date; uptime'
在脚本中解析uptime输出:
#!/bin/bash
# 获取uptime输出
uptime_output=$(uptime)
# 解析各个部分
current_time=$(echo "$uptime_output" | awk '{print $1}')
uptime_duration=$(echo "$uptime_output" | awk '{print $3,$4,$5}' | sed 's/,//g')
users=$(echo "$uptime_output" | awk '{print $6}')
load_average=$(echo "$uptime_output" | awk -F 'load average:' '{print $2}')
echo "当前时间: $current_time"
echo "运行时间: $uptime_duration"
echo "登录用户: $users"
echo "平均负载: $load_average"
# 获取更详细的信息
load1=$(echo "$load_average" | awk -F ', ' '{print $1}')
load5=$(echo "$load_average" | awk -F ', ' '{print $2}')
load15=$(echo "$load_average" | awk -F ', ' '{print $3}')
echo "1分钟负载: $load1"
echo "5分钟负载: $load5"
echo "15分钟负载: $load15"
# 结合who命令显示登录用户详情
uptime && who
# 结合w命令显示更详细的信息
w
# 查看系统启动日志中的启动时间
journalctl --list-boots | head -5
# 查看系统启动以来的进程统计
uptime && echo "系统进程统计:" && ps -eo pid,comm,pcpu,pmem --sort=-pcpu | head -10
# 检查系统是否需要重启(运行时间过长)
uptime -p | grep -E "day|week|month" && echo "建议安排重启" || echo "系统运行正常"
#!/bin/bash
# 监控脚本:检查系统负载并发送警报
MAX_LOAD=4.0 # 根据CPU核心数调整
# 获取1分钟负载
load1=$(uptime | awk -F 'load average:' '{print $2}' | awk -F ', ' '{print $1}' | tr -d ' ')
# 转换为浮点数进行比较
if (( $(echo "$load1 > $MAX_LOAD" | bc -l) )); then
echo "警告:系统负载过高!当前负载: $load1"
echo "运行时间: $(uptime -p)"
echo "当前用户: $(uptime | awk '{print $6}')"
# 这里可以添加发送邮件或通知的逻辑
# mail -s "系统负载警报" admin@example.com <<< "系统负载过高: $load1"
fi
# 记录到日志
echo "$(date '+%Y-%m-%d %H:%M:%S') - 负载: $load1, 运行: $(uptime -p)" >> /var/log/system_load.log
如何解读不同时间段的负载值:
# 假设uptime输出为:
# load average: 1.50, 0.80, 0.30
# 这个输出表示:
# 1分钟负载: 1.50 ← 最近1分钟系统较忙
# 5分钟负载: 0.80 ← 最近5分钟系统中等负载
# 15分钟负载: 0.30 ← 最近15分钟系统较空闲
# 负载趋势分析:
# 1.50 > 0.80 > 0.30 表示负载正在下降
# 0.30 < 0.80 < 1.50 表示负载正在上升
# 三个值相近表示负载稳定
| 系统类型 | 命令差异 | 备注 |
|---|---|---|
| Linux | uptime -p uptime -s |
支持友好格式和启动时间显示 |
| macOS | 不支持 -p 和 -s 选项 |
输出格式与Linux略有不同 |
| FreeBSD | uptime -h 显示帮助 |
选项与Linux不完全兼容 |
| Solaris | 基本功能相同 | 输出格式可能有所不同 |
/proc/uptime和/proc/loadavg文件# 1. uptime命令无输出或报错
# 检查/proc文件系统
ls -la /proc/uptime /proc/loadavg
# 2. 运行时间显示不正确
# 检查系统时间
date
hwclock
# 3. 负载异常高
# 检查进程
top
htop
ps aux --sort=-%cpu | head -10
# 4. 检查I/O等待
iostat -x 1
# 5. 查看系统启动日志
dmesg | grep -i "boot"
journalctl --list-boots
# 6. 手动计算运行时间
cat /proc/uptime
# 第一个数字是系统运行总秒数,第二个数字是空闲时间总秒数
# 7. 直接查看负载文件
cat /proc/loadavg
# 输出格式:1分钟负载 5分钟负载 15分钟负载 运行进程数/总进程数 最近运行进程ID
uptime命令从以下系统文件获取信息:
# 系统运行时间(秒)
cat /proc/uptime
# 输出:2175436.75 1950245.23
# 第一个数字:系统运行总秒数
# 第二个数字:系统空闲总秒数
# 系统负载
cat /proc/loadavg
# 输出:0.05 0.10 0.15 2/512 12345
# 前三个:1、5、15分钟平均负载
# 第四部分:当前运行进程数/总进程数
# 第五部分:最近运行的进程PID
# 当前时间
date +%H:%M:%S
# 登录用户数
who | wc -l
#!/bin/bash
# 方法1:使用uptime命令(推荐)
uptime_info=$(uptime)
# 方法2:从/proc文件系统直接读取
uptime_seconds=$(awk '{print $1}' /proc/uptime)
load_average=$(cat /proc/loadavg)
current_time=$(date '+%H:%M:%S')
user_count=$(who | wc -l)
# 将秒数转换为可读格式
days=$((uptime_seconds / 86400))
hours=$(( (uptime_seconds % 86400) / 3600 ))
minutes=$(( (uptime_seconds % 3600) / 60 ))
seconds=$((uptime_seconds % 60))
echo "系统已运行: ${days}天 ${hours}小时 ${minutes}分钟 ${seconds}秒"
echo "系统负载: $load_average"
echo "当前时间: $current_time"
echo "登录用户: $user_count"
# 方法3:使用sysctl命令(BSD系统)
# sysctl kern.boottime | awk '{print $4}' | tr -d ','
# date -r $(sysctl -n kern.boottime | awk '{print $4}')