2

我有一个任务会随着时间的推移消耗仲裁 CPU 和内存。它给了我一个执行以下 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

我想在 bash/python/perl 中每 20 秒获取位于第 4 列和第 3 行 a[3][4] 的值,即 78.22。所以我想要的脚本将执行 mpstat 命令并打印出指定列中的值,并根据它创建图形的值。我正在考虑在 .dat 文件中附加所需的值并运行 gnuplot 或创建图形的应用程序。

关于如何去的任何建议?

4

2 回答 2

5

您可以使用 获取第 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'
于 2012-12-11T23:03:39.633 回答
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无限循环
  • $(mpstat -P 1 | tail -n 1)mpstat 只有 cpu 1-P 1和 tail-n 1最后一行,返回值$()
  • arr=( ... )命令返回值到数组
  • echo "${arr[3]}"回显数组索引 3
  • sleep 20睡眠 20 秒
  • >> file.txt将标准输出发送到 while 循环块内的文件。
  • _mpstat &将函数发送到后台进程&
  • echo "_mpstat PID: $!返回函数的 PID

您可以 grep PID 以显示其父级并在需要时终止两者。

于 2012-12-12T05:12:15.243 回答