操作系统: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
),而在第二个示例中,sleep
while 循环中的命令是限制。请注意,在第一个示例中也top
永远不会完成,这使得处理任何管道输出成为一个问题,因为读取的程序永远不会获得“进程结束”信号,这对于像or 这样stin
的基于列的程序来说尤其是一个问题。看看如何例如awk
cut
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
加工:
通过stin
read 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,内文