我编写了一个简单的 bash 脚本,该脚本每 5 分钟使用“正常运行时间”检查一次负载平均值,并将结果写入文本文件。一切都很好,除了一件事:每天 12:00 到 13:00 我看到文本值“平均”而不是常规整数值。
我应该如何解释“正常运行时间”命令的“平均”结果?如果我从命令行运行“正常运行时间”,一切正常 - 我看到常规整数值。
源码如下:
#!/bin/bash
sCurrentUptime="$(uptime | awk '{print $10}')"
iLength="${#sCurrentUptime}"
sUptime="${sCurrentUptime:0:iLength-1}"
iUptime=${sUptime/.*}
now="$(date)"
echo $now';'$iUptime
这是输出(最后一列包含负载平均值):
Thu Apr 17 08:40:01 MSK 2014;0
Thu Apr 17 09:00:01 MSK 2014;2
Thu Apr 17 09:20:02 MSK 2014;3
Thu Apr 17 09:40:02 MSK 2014;3
Thu Apr 17 10:00:01 MSK 2014;2
Thu Apr 17 10:20:01 MSK 2014;3
Thu Apr 17 10:40:01 MSK 2014;1
Thu Apr 17 11:00:02 MSK 2014;2
Thu Apr 17 11:20:01 MSK 2014;3
Thu Apr 17 11:40:01 MSK 2014;2
Thu Apr 17 12:00:02 MSK 2014;3
Thu Apr 17 12:20:02 MSK 2014;average
Thu Apr 17 12:40:01 MSK 2014;average
Thu Apr 17 13:00:01 MSK 2014;average
Thu Apr 17 13:20:01 MSK 2014;3
Thu Apr 17 13:40:01 MSK 2014;1
Thu Apr 17 14:00:01 MSK 2014;2
Thu Apr 17 14:20:01 MSK 2014;3
Thu Apr 17 14:40:01 MSK 2014;2
Thu Apr 17 15:00:01 MSK 2014;2
Thu Apr 17 15:20:01 MSK 2014;3
Thu Apr 17 15:40:01 MSK 2014;1
答案1
uptime的输出取决于uptime本身,即
在一个系统上
$ uptime
17:35pm up 5 days 9:24, 9 users, load average: 0.30, 0.28, 0.28
因此,有 12 个字段。
在另一个系统上
uptime
17:36:15 up 8:44, 2 users, load average: 0.09, 0.30, 0.41
因此有 10 个字段。当然,它可能会因您的系统而延迟。我假设您在中午打开了机器,这导致正常运行时间为 N 天和 0 小时,而后者不显示(或类似的情况)。
因为您似乎无论如何都想要最后一列,所以您可以将awk
命令替换为
uptime | awk '{print $NF}'
NF
是字段数,$NF
因此也是该行的最后一个字段。它认为这更防错。
如果您想要第一个负载平均值,而不是第三个,那么您可以这样做
uptime | awk '{print $(NF-2)}'
答案2
出于脚本编写的目的,我发现直接获取负载平均值/proc/loadavg
以尝试解析uptime
令人讨厌的输出更容易。
例子
$ cat /proc/loadavg
1.08 0.77 0.85 2/838 16771
从man proc
:
/proc/loadavg
The first three fields in this file are load average figures
giving the number of jobs in the run queue (state R) or waiting for
disk I/O (state D) averaged over 1, 5, and 15 minutes. They are
the same as the load average numbers given by uptime(1) and other
programs. The fourth field consists of two numbers separated by a
slash (/). The first of these is the number of currently runnable
kernel scheduling entities (processes, threads).
The value after the slash is the number of kernel scheduling
entities that currently exist on the system. The fifth field is
the PID of the process that was most recently created on the system.