Armazenar a utilização da CPU no arquivo CSV

1

SO: Debian 8 x64

Gostaria de registrar a cada 5 segundos a porcentagem da CPU em um arquivo CSV no formato abaixo:

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

Não estou familiarizado com o uso do programa top para calcular ((us + sy) / (us + sy + id) * 100) usando awk / grep. Gostaria de receber ajuda ao fazê-lo.

Através de minhas pesquisas, vi alguns exemplos de pessoas usando top -bn1 e top -bn2. No entanto, se meu loop estiver chamando de top, suponho que não precisaria usar o modo batch.

Aqui está o script de shell que comecei a escrever.

#!/bin/bash

while sleep 5; do "top | grep "Cpu(s)" | awk '{}' >> cpu.csv; done
    
por linguru772x 16.08.2015 / 00:35

3 respostas

0

1) Vamos comparar as duas versões seguintes:

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

Você verá que no primeiro exemplo o tempo é definido pelo intervalo de atualização de top (definido para 10 segundos via -d 10 ), enquanto no segundo o comando sleep no loop while é o limite . Observe que também top nunca termina no primeiro exemplo, o que torna o processamento de qualquer saída canalizada um problema, já que o programa que lê stin nunca recebe um sinal "process ended" que é especialmente um problema para programas baseados em coluna awk ou cut . Veja como, por exemplo,

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

não produzirá saída nos intervalos top produz, mas em lotes irregulares, enquanto

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

produz saída nos intervalos desejados.

Longa história curta: use while loop E top -bn1

2) awk processamento:

Com stin lido de top -bn1 | grep Cpu , você pode usar:

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"%" }'

Como BEGIN { FS == " +" } usará um ou mais espaços ( + ) como separadores de campo, os respectivos campos para nós, sy e id serão de $ 2, $ 4 e $ 8.

A solução alternativa com cmd1="..." ; while ( cmd1 | getline a) é necessária para ler o resultado de uma chamada do sistema como variável no awk. Veja a resposta @ ghostdog74 aqui

    
por 16.08.2015 / 02:29
0

Você pode fazer isso via 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];
}

A maior parte do código é para imprimir a data ...

    
por 17.08.2015 / 10:38
-1

Eu diria que as soluções propostas são exageradas. Isso deve fazer ...

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

Claro, coloque isso em while loop junto com o tempo de espera desejado.

Ele usa a carga da CPU do comando "uptime", que é igual ao carregamento "superior" e o anexa a um arquivo.

BR, Neven

    
por 17.08.2015 / 11:59