Команда «время безотказной работы» возвращает «средний»

Я написал простой скрипт bash, который проверяет средние значения нагрузки, используя «время безотказной работы» каждые 5 минут, и записывает результат в текстовый файл. Все в порядке, кроме одного: каждый день с 12:00 до 13:00 я вижу текстовое значение «среднее» вместо обычных целочисленных значений.

Как мне интерпретировать «среднее» в результате команды «uptime»? И если я запускаю «время простоя» из командной строки, все в порядке – я вижу регулярные целочисленные значения.

Исходный код:

#!/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 

Выходное время работы зависит от времени безотказной работы, т.е.

На одной системе

 $ 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)}' 

Для сценариев мне легче получить средние значения нагрузки непосредственно из /proc/loadavg затем попытаться разобрать /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.