将 CPU 利用率存储到 CSV 文件中

将 CPU 利用率存储到 CSV 文件中

操作系统:Debian 8 x64

我想每 5 秒将 CPU 百分比记录到以下格式的 CSV 文件中:

YYYY-MM-DD HH:MM:SS,CPU%

我不熟悉如何使用该top程序使用 awk/grep 计算 ((us+sy)/(us+sy+id)*100)。希望您能提供帮助。

通过搜索,我看到了一些人们使用 top -bn1 和 top -bn2 的例子。但是,如果我的循环调用 top,我认为我根本不需要使用批处理模式。

这是我开始编写的 shell 脚本。

#!/bin/bash

while sleep 5; do "top | grep "Cpu(s)" | awk '{}' >> cpu.csv; done

答案1

您可以通过以下方式执行此操作vmstat

#!/usr/bin/perl

open VMSTAT, "vmstat 5|";
<VMSTAT>; <VMSTAT>; # skip the header
while (<VMSTAT>) {
    @now = split;
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime (time);
    printf "%d-%02d-%02d %02d:%02d:%02d,%d%\n", $year+1900, $mon, $mday, $hour, $min, $sec,
        $now[12] + $now[13];
}

大部分代码用于打印日期......

答案2

1)我们来比较一下以下两个版本:

while sleep 0.1 ; do top -d 10 | grep Cpu ; done
#versus batch mode
while sleep 0.1 ; do top -d 10 -bn1 | grep Cpu ; done

top您将看到,在第一个示例中,时间由的更新间隔定义(通过 设置为 10 秒-d 10),而在第二个示例中,sleepwhile 循环中的命令是限制。请注意,在第一个示例中也top永远不会完成,这使得处理任何管道输出成为一个问题,因为读取的程序永远不会获得“进程结束”信号,这对于像or 这样stin的基于列的程序来说尤其是一个问题。看看如何例如awkcut

top -d 0.1 -b | grep Cpu | cut -d' ' -f1

不会按间隔产生输出top,而是不规则批次地产生输出,而

while sleep 0.1 ; do top -bn1 | grep Cpu | cut -d' ' -f1 ; done

以所需的时间间隔产生输出。

长话短说:一定要使用while循环并且top -bn1

2)awk加工:

通过stinread from top -bn1 | grep Cpu,您可以使用:

awk 'BEGIN { FS == " +" } ; { cmd1="date +%Y-%m-%d" ; cmd2="date +%H:%M:%S" ; while ( cmd1 | getline a ) ; while ( cmd2 | getline b) ; print a,b,($2+$4)/($2+$4+$8)*100"%" }'

由于BEGIN { FS == " +" }将使用一个或多个 ( +) 空格作为字段分隔符,因此 us、sy 和 id 的相应字段为 $2、$4 和 $8。

解决方法cmd1="..." ; while ( cmd1 | getline a)是将系统调用的结果读取为 awk 中的变量。请参阅@ghostdog74 的回答这里

答案3

我想说,提出的解决方案有些过了。这应该可以……

echo $(date +'%Y-%m-%d %H:%M:%S,' && uptime | awk '{print "CPU: " $9*100 "%"}' ) >> myfile.csv

当然,将其与所需的睡眠时间一起放入 while 循环中。

它从“uptime”命令获取 CPU 负载,这与“top”负载相同,并将其附加到文件中。

BR,内文

相关内容