PDA

View Full Version : problema con grep e top


Janky
02-09-2009, 16:34
Ciao a tutti,

devo scrivere uno scriptino che ogni tot secondi scriva in un file l'ora corrente e l'uso di cpu

se scrivo

top | grep Cpu

mi stampa sta roba

Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 98.5%id, 1.0%wa, 0.0%hi, 0.2%si, 0.0%st


a me serve solo il primo valore, quindi aggiungo un cut dopo in sto modo

top | grep Cpu | cut -b 10-14

ma così non mi stampa più nulla! dove sbaglio??

Gimli[2BV!2B]
02-09-2009, 20:52
w -u | cut -sd, -f4,6,8

Esempio di output:gimli@altarf:~$ w -u | cut -sd, -f4,6,8
03,15,16

03 = carico percentuale medio dell'ultimo minuto (-f4)
15 = carico percentuale medio degli ultimi 5 minuti (-f6)
16 = carico percentuale medio degli ultimi 15 minuti (-f8)

Janky
02-09-2009, 20:55
dell'ultimo minuto? perchè a me servirebbe il carico ogni 5 secondi

cmq grazie mille!

Janky
02-09-2009, 21:35
no, ma non mi va bene il valore medio... devo proprio lavorare su top perchè devo prendere la percentuale corrente di uso di cpu da parte dello user

con questo comando prendo l'ora
[code]
top -n 1 | grep average | cut -c 20-28
[/code]

c'è un modo per prendere sempre con un comando solo anche la terza riga, cioè quella dei timings di cpu che effettivamente mi interessano?

devo avere come risultato un file del genere

22:31:46 0.0
22:31:51 22.7
22:31:56 34.9
22:32:01 20.4
22:32:06 20.1
22:32:11 21.7
22:32:16 21.2
22:32:21 20.8
22:32:26 18.8
22:32:31 21.0
22:32:36 21.1
22:32:41 17.6

cioè l'orario e il tempo di cpu associato...

solo che se lo faccio con 2 grep separati mi andrebbe a capo ogni riga ottentendo una roba del genere, che non mi va bene purtroppo

22:31:46
0.0
22:31:51
22.7
22:31:56
34.9
22:32:01
20.4
22:32:06
20.1
22:32:11
21.7
22:32:16
21.2
22:32:21
20.8
22:32:26
18.8
22:32:31
21.0
22:32:36
21.1
22:32:41
17.6

Gimli[2BV!2B]
02-09-2009, 23:05
Uff, che pignolo! :)

Così potrebbe andare?
echo 100 - `top -d0 -n1 | sed -e '/^Cpu(s):/!d' -e 's/.*ni,[^\ ]*//' -e 's/%.*$//'` | bc

Prende la percentuale di idle, dopodiché calcola 100 - $idle.

Psycotic
03-09-2009, 09:59
echo "`date +%H:%M:%S` `top -n1|grep Cpu|awk '{print $2}'|sed s/,//g`"

Janky
03-09-2009, 10:36
grazie mille per l'aiuto che mi state dando :)

i 2 comandi che mi avete dato sembrano funzionare molto bene, ma se li lanciate "a mano" a distanza di 5 secondi, il valore di cpu che vi stampa a voi cambia??

perchè a me rimane sempre lo stesso, anche se lo lancio 15 volte di seguito :stordita:

Psycotic
03-09-2009, 14:04
che devo dire, in vita mia non ero mai accorto di sta cosa..

Il top nella prima paginata dice c....ate, hai ragione!

Psycotic
03-09-2009, 14:20
in alternativa potresti provare un tool per statistiche come il sar.
Oppure puoi fare 2 pagine di top e poi prendere solo la seconda pagina.

Una cosa cosi':

echo "`date +%H:%M:%S` `top -n2|grep Cpu|awk '{print $2}'|sed s/,//g|tail -1`"

Janky
13-09-2009, 20:29
argh! speravo di averla scampata usando sar... ma al mio prof non va bene...

mannaggia a me che non so usare le espressioni regolari... ora tento di studiarmele ben bene

sar -u 4 5 restituisce i dati con questa sintassi (il 4 sta per 4 secondi tra una iterazione e l'altra, il 5 per il numero di iterazioni da fare)


Linux 2.6.27.5 (specweb_web) 09/13/2009

08:36:20 PM CPU %user %nice %system %iowait %steal %idle
08:36:24 PM all 2.74 0.00 0.25 0.00 0.00 97.01
08:36:28 PM all 0.75 0.00 0.25 0.00 0.00 99.00
08:36:32 PM all 3.00 0.00 0.75 0.00 0.00 96.25
08:36:36 PM all 0.00 0.00 0.25 2.00 0.00 97.76
08:36:40 PM all 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 1.30 0.00 0.30 0.40 0.00 98.00


a me serve il tempo e la somma di user+system in un file
mentre in un altro mi serve il tempo e la iowait

al momento non ho proprio idea di come si faccia lol

Janky
13-09-2009, 21:04
ok con



echo "`sar -u 2 4|grep M|awk '{print $1 $4+$6}'|sed 1d`"



mi sono avvicinato a quello che mi serve... ora... come diavolo faccio a mettere lo spazio tra $1 e $4+$6??

così mi stampa

10:03:231
10:03:254.52
10:03:270
10:03:294.5

al posto di

10:03:23 1
10:03:25 4.52
10:03:27 0
10:03:29 4.5

Gimli[2BV!2B]
14-09-2009, 00:35
sar -u 2 4 | awk '/AM|PM/{ if(FNR>3) print $1" "$2" "$4+$6}'


/AM|PM/ sostituisce il grep ed è più "preciso" (| in mezzo funge da OR tra le due stringhe).
if(FNR>3) salta fino alla terza riga.
" " è il famoso spazio.
echo non serve, se l'hai tenuto dal mio precedente esempio serviva solo per bc.
Gli "" esterni forzano il tutto ad una stringa, non sono indispensabili, salvo inserimento in variabili di command substitution con output contenenti spazi.
Command substitution (http://tldp.org/LDP/abs/html/commandsub.html): gli `` esterni dicono a bash/sh di mettere in quel punto l'output del comando contenuto (cosa che accade anche senza), oltretutto invocando una subshell.

Janky
14-09-2009, 01:56
grazie mille!!

mi sono accorto di una cosa... sar visualizza solo PM, se l'ora è minore di 12 non visualizza AM

in ogni caso non mi interessa che stampi anche average, quindi mi può bastare


sar -u 2 4 | awk '{ if(FNR>3) print $1" "$4+$6}'


ripeto, grazie mille per l'aiuto!!

Janky
14-09-2009, 17:38
mannaggia a sar...


purtroppo il fatto del PM/AM è un bug bello grosso...


se l'ora è minore di 12 come ho detto prima, non viene stampato AM, quindi i campi che mi interessa sommare sono $3 e $5

se invece l'ora è maggiore di 12 viene stampato PM, quindi i dati che devo sommare diventano il $3 e il $6!!! mannaggia come posso fare??

edit: risolto con sed s/PM//