Есть ли способ запуска vmstat, iostat, sarкоманды несколько раз с интервалом 300 миллисекунд?
Я знаю, что значения по умолчанию - 1 секунда, но я хочу запускать каждые 300 миллисекунд для мониторинга производительности системы.
2 ответа на вопрос
0
Thomas Dickey
Вы можете написать скрипт, который вызывает команду несколько раз с интервалом 0,3 секунды:
Некоторые системы (например, Linux, FreeBSD, Solaris ) предоставляют команду уровня sleepкоманды, которая принимает интервалы меньше 1 секунды. Для них можно написать обычный цикл оболочки, такой как
#!/bin/sh CMD=vmstat $CMD while : do $CMD | tail -n 1 sleep 0.3 done
Другие языки сценариев, такие как Perl, предоставляют функции, которые можно использовать вместо них. Для Perl есть usleepфункция Time::HiRes, например,
#! / usr / bin / perl -w использовать строгое; использовать Time :: HiRes qw (usleep); наш $ CMD = "vmstat"; система ($ CMD); while (1) { система ("$ CMD | tail -n 1"); усли (300000); }
Просто заметка `vmstat`" почти в реальном времени ", поэтому разница между 300/500/800 миллисекундами на самом деле может не быть большой.
Unfundednut 9 лет назад
0
Но накопленная ошибка за несколько минут будет заметна (даже после учета времени запуска самого `vmstat`).
Thomas Dickey 9 лет назад
1
-1
rhys stevens
Я попробовал этот подход, скопировав vmstat в цикле while, чтобы я мог легко выйти из него после завершения теста, а затем проанализировал собранный файл журнала в csv для легкого импорта для построения графиков. Это сработало, НО vmstats 1-ая строка была почти всегда одинаковой, так что это было ПОЛЕЗНО. Мне пришлось запустить vmstat вручную и собрать журналы в файл, а затем обработать их.
#!/bin/bash OUTPUT="/dropinbox/vmstat_$(hostname)_$(date +%Y-%m-%d_%H-%M).csv" echo Starting Recording... echo Press Q to exit. # create blank temp file echo '' > /tmp/vmstat.log while true; do # -t time -a active and inactive memory reporting -n no repeate headers -S M size vmstat 1 1 -tanwS M >> /tmp/vmstat.log # In the following line -t for timeout, -N for just 1 character # -t 0.25 therefore loop will run 4 times a second. read -t 0.25 -N 1 input if [[ $input = "q" ]] || [[ $input = "Q" ]]; then # The following line is for the prompt to appear on a new line. echo Finshed break fi done # remove blank lines sed -i '/^$/d' /tmp/vmstat.log # remove headers sed -i '/procs/d' /tmp/vmstat.log # Keep 1 line of the 2nd headers grep -m1 r /tmp/vmstat.log > /tmp/headers tr -s ' ', < /tmp/headers | sed s/,// > $OUTPUT # remove all 2nd line headers sed -i '/r/d' /tmp/vmstat.log # process columns into csv output missing out column 18 (Date) as this got in myway awk 'BEGIN { OFS = "," }!($18="")' /tmp/vmstat.log |tr -s ',' >> $OUTPUT cat -vet $OUTPUT echo finished saving to $OUTPUT