Распечатка значения из матрицы

1

У меня есть задача, которая с течением времени потребляет процессор и память. Он дает мне выход, выполняющий следующую команду linux:

mpstat -u 1 -P ALL

Результат выглядит так:

02:22:14 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
02:22:15 PM  all    4.51    0.00    0.11    0.00    0.00    0.00    0.00    0.00   95.37
02:22:15 PM    0    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   99.00
02:22:15 PM    1   **78.22**    0.00    0.99    0.00    0.00    0.00    0.00    0.00   20.79

02:22:15 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
02:22:15 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
02:22:15 PM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
02:22:15 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM    9    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   13    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   15    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
02:22:15 PM   16    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   17    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   18    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   19    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
02:22:15 PM   20    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   21    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   22    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:22:15 PM   23    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Я хочу захватить значение, расположенное в 4-м столбце и 3-й строке a [3] [4], т.е. 78,22 каждые 20 секунд в bash/python/perl. Таким образом, сценарий, который я хочу, выполнит команду mpstat и распечатает значение в указанном столбце и на основе значений, которые он создает граф. Я думал о добавлении требуемого значения в файл.dat и запускает gnuplot и/или приложение, которое создает граф.

Любое предложение о том, как идти?

Теги:

2 ответа

4
Лучший ответ

Вы можете получить 3-й ряд и 4-я ячейка, используя awk. Следующий код захватывает эту ячейку из вывода mpstat и добавляет ее вместе с текущей меткой времени UNIX в файл статистики.

mpstat -u 1 -P ALL | awk 'NR==4 {print systime(), $4}' >> stats.txt

Для запуска этой команды каждые 20 секунд:

watch -n 20 "mpstat -u 1 -P ALL | awk 'NR==4 {print systime(), \$4}' >> stats.txt"

Затем заговор с gnuplot:

cat stats.txt | gnuplot -p -e 'set datafile separator " "; plot "-" using 1:2 with lines'
  • 0
    При этом: mpstat -u 1 -P ALL | awk 'NR == 4 {print systime (), $ 4}' >> stats.txt, stats.txt оказывается пустым файлом.
  • 0
    Кроме того, я вижу, что он не печатает значения непрерывно, а печатает его один раз и останавливается. Моя цель состоит в том, чтобы постоянно следить за использованием ЦП, пока процесс не запустится, поэтому этого будет недостаточно, но некоторые улучшения будут потрясающими.
Показать ещё 2 комментария
0

Попробуйте следующее

#!/bin/bash
function _mpstat() {
    while :; do
        arr=( $(mpstat -P 1 | tail -n 1) )
        echo "${arr[3]}"
        sleep 20
    done >> file.txt
}
_mpstat &
echo "_mpstat PID: $!"

объяснение

  • while :; do while :; do бесконечную петлю
  • $(mpstat -P 1 | tail -n 1) Mpstat только cpu 1 -P 1 и tail -n 1 последняя строка, возвращаемое значение $()
  • arr=(... ) Команды возвращают значение в массив
  • echo "${arr[3]}" индекс эхо-массива 3
  • sleep 20 Сон в течение 20 секунд
  • >> file.txt Отправьте stdout в файл внутри цикла while.
  • _mpstat & Отправить функцию в фоновый процесс &
  • echo "_mpstat PID: $! Возвращает PID функции

Вы можете grep PID отобразить своего родителя и убить как при необходимости.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню