2014-10-31 4 views
0

Я хотел бы запустить скрипт оболочки iff. время ожидания ожидающих устройств ввода/вывода превышает определенное значение, например, 70%, как определено сверху. Я намереваюсь запустить проверку на каждый каждый интервал, скажем, каждые 1 минуту или каждые 5 минут, cron. Несмотря на то, что я прочитал руководство для верха, я не смог найти, как заставить его отображать только% ва, а затем выйти. Какие-либо предложения? Спасибо!получить только время ожидания ввода/вывода

Это то, что я пытался до сих пор:

WA=$(top -n1 |awk -F, 'NR==3 {print $5}') 
tr -d "[:alpha:]" <<< $W 

дает

[[39;49([ 13.9%([[39;49 

в то время как

grep -o "[0-9]"<<<"$WA" 

дает

3 
9 
4 
9 
1 
3 
9 
3 
9 
4 

Ни один из них не подходит для ввода в if -gt; fi условное заявление - и я просто не могу понять, что здесь происходит!

+0

Решена ли ваша проблема? – RBH

+0

Нет. У меня теперь есть проблема, когда первое чтение сверху * всегда * 14.9%. Это связано с тем, что, когда я бегу сверху, он всегда читает 14,9% в своем первом интервале, прежде чем подниматься на любой ожидаемый диапазон значений, о которых я думал. Поскольку я хочу запускать скрипт, когда время ожидания велико, это не помогает мне. –

+0

На моей домашней машине вершина всегда возвращает 1,3% для ва за первый интервал, поэтому, по-видимому, это зависит от машины. Не уверен, что делать с этим сейчас. Может быть, взять нагрузку в среднем на многие интервалы, как? –

ответ

1

Проблема здесь состоит в том, что вывод содержит несколько управляющих последовательностей, которые используются для окрашивания. Это вызывает проблему. Один из способов решения - использовать опцию -b.

$ top -bn2 |awk -F, 'NF==8 {print $5}'|tail -n1|tr -d '[[:alpha:]] ' 
3.8 

Здесь -b опция заставит top работать в пакетном режиме, и, таким образом, специальные управляющие последовательности не будут выводиться.

Для того, чтобы удалить слово wa, вы можете использовать tr -d '[[:alpha:]] ', который удаляет на выходе любые алфавитные символы.

Надеюсь, что это решило проблему.

+0

Спасибо, это самое элегантное решение для обновленной проблемы. Однако top всегда возвращает 14,9% для% ва за первый интервал.На моей домашней машине он всегда возвращает 1,3% в свой первый интервал, независимо от того, что делает каждая машина. Так как мне нужно запустить скрипт, когда время ожидания велико, я не могу решить мою проблему. –

+1

Как правило, верхние, сарные и другие утилиты обеспечивают кумулятивное значение на их первом выходе. И последующие выходы будут иметь текущие значения. Я обновил команду, чтобы напечатать значение со второго выхода. –

+1

Еще одна вещь, которую нужно добавить, если вам нужно получить среднее значение для заданного интервала времени, например 10 секунд, 1 минуту и ​​т. Д., Тогда вы используете опцию '-d', например' top -bn2 -d10'. Это приведет к появлению io-ожиданий, которые произошли в течение этого 10-секундного интервала. –

0

Если вы просто хотите напечатать %wa из верхней команды можно использовать следующую команду:

top -n1 |awk -F, 'NR==3 {print $5}' 
0

Попробуйте это:

Это удалить бы пространство, а также %wa в верхнем выходе

top -n1 |awk -F, ' NR==3 { gsub(/ /, "", $5); gsub (/%.*/,"",$5); print $5}' 

Объяснение:

gsub(/ /, "", $5) удаляет пространство от пятого поля, которое является %wa и

gsub (/%.*/,"",$5) удаляет все символы после %

Смежные вопросы