R: [PLUTO-help] Cerco aiuto per uno script di shell

sabpll a libero.it sabpll a libero.it
Mar 3 Ago 2004 23:31:08 CEST


Alle 15:14, giovedí 29 luglio 2004, Alberto Pachera ha scritto:
> Questo è lo scipt che ho creato mostra delle info sul sistema
> Se a qualcuno interessa o se notate imprecisioni... :

> #! /bin/sh
- #!/bin/bash

Non è pignoleria ma potresti usare delle caratteristiche
particolari della tua shell, per cui è meglio specificare
quale shell vuoi usare.

> vmstat -s > vmstat.info
> vmstat > vmstatn.info

Fare cosi è sbagliato per almeno tre buone ragioni.
 1) È stupido.
 2) Non è efficiente.
 3) É una falla nella sicurezza.

É stupido. É come tornare ai tempi del DOS che usava file
temporanei per simulare il piping dell' UNIX. Per usare un
file temporaneo ci deve essere una buona ragione.

Non è efficiente. Scrivi sul disco una informazione che puoi
usare direttamente cosi com'è e non devi piú utilizzare.
Scrivere (e leggere) dal disco comporta molti tempi morti
e spreco di risorse. Potresti cavartela con uno o piú pipe. 
Forse pensi che eseguire molte volte vmstat sia uno spreco
ma in linea di principio è molto piú oneroso leggere lo
stesso file molte volte (meccanismi di caching a parte).

É una falla per la sicurezza. Cosa succede se due utenti
lanciano lo stesso programma contemporaneamente?
Nella migliore delle ipotesi uno dei due processi non potrà
accedere al file e terminerà con un errore. Oppure potrebbe
bloccarsi. Oppure potrebbero bloccarsi entrambi. Oppure
nessuno si accorge dell'errore ed un processo inquina i dati
dell'altro; è una situazione terribile perché hai un output errato
e non te ne accorgi. O se te ne accorgi non puoi correggere
l'errore perché non potrai mai capire come si è verificato.
Per questo quando crei file temporanei dovresti usare dei
nomi generati casualmente, non facilmente prevedibili, posti
nella directory dei file temporanei. É facile farlo, ci sono degli
strumenti ad hoc.


>
> echo ""
> echo "   CPU information"
> echo "---------------------"

Questo non è un errore di programmazione ma di stile.
É chiaro che questo è solo un esercizio che non fa altro
che estrarre alcune informazioni sul processore fornite da
vmstat e tradurre le frasi in italiano.
Allora perché il titolo è in inglese?


> echo -n "Tipo cpu                      : "
> cat /proc/cpuinfo | grep 'model name' | cut -c 14-60
- sed -n 's/model name/Tipo cpu  /p' /proc/cpuinfo

sostituendo queste due righe con questa solo ottieni
lo stesso risultato con un risparmio è enorme: avvii un solo
processo invece di tre.
_grep_, _sed_  ed anche _cut_ possono leggere i file in input
quindi bastava fare semplicemente:

$ grep 'model name' /proc/cpuinfo | cut -c 14-60

andava bene. Ma quello che volevi fare è sostituire le
frasi inglesi con frasi italiane; il metodo piú semplice è
ricorrere ad un filtro che effettua sostituzioni di testo
cioè _sed_.


> echo -n "% cpu libera                  : "
> cat vmstatn.info | grep 0 | cut -c 74-76
> echo -n "% cpu utilizzata dal sistema  :"
> cat vmstatn.info | grep 0 | cut -c 70-72
> echo -n "% cpu utilizzata dai processi :"
> cat vmstatn.info | grep 0 | cut -c 67-69

Usi  `grep 0 ` per isolare  l'ultima riga per l'output di
vmstat; lo strumento per fare ciò è _tail_.
Inoltre a te serve solo l'ultima riga di vmstat quindi
bastava fare:

- vmstat  | tail 1 > vmstatn.info

e poi:

- echo -n "% cpu libera                  : "
- cut -c 74-76 vmstatn.info
- echo -n "% cpu utilizzata dal sistema  :"
- cut -c 70-72 vmstatn.info
- echo -n "% cpu utilizzata dai processi :"
- cut -c 67-69 vmstatn.info

Ma questo metodo non è il migliore. _cut_ serve ad isolare
delle porzioni delle linee di un file di testo.
Quando si hanno dei campi (come in un file che contiene un
database) esistono degli strumenti migliori. In genere si
tratta di veri e propri linguaggi di scripting ma quello che
mi sembra piú adatto è _awk_ (o _gawk_ la sua versione GNU)

vmstat | awk 'NR == 3 {
printf "%% cpu libera                  :  %s\n", $15 
printf "%% cpu utilizzata dal sistema  :  %s\n", $14 
printf "%% cpu utilizzata dai processi :  %s\n",  $13}'


> echo ""
> echo ""
> echo "   Memory information"
> echo "------------------------"

Vedi sopra!  Io consiglio:

- echo -e "\n\n  MEMORIA\n ------------------------" 


> echo -n "Memoria totale                : "
> cat vmstat.info | grep 'total memory' | tr -s ' ' | cut -d ' ' -f2
> echo -n "Memoria utilizzata            : "
> cat vmstat.info | grep 'used memory' | tr -s ' ' | cut -d ' ' -f2
> echo -n "Memoria libera                : "
> cat vmstat.info | grep 'free memory' | tr -s ' ' | cut -d ' ' -f2
> echo ""

Sembrerebbe che si debba invocare _sed_ tre volte ma _sed_
può effettuare sostituzioni multiple, basta inserile su piú
righe

vmstat -s | sed -n "s/total memory/Memoria totale/p
s/used memory/Memoria utilizzata/p	
s/free memory/Memoria libera/p"

Non è esattamente quello che vuoi: prova cosi:

vmstat -s | sed -n "s/\(.*\)total memory/Memoria totale                : \1/p
s/\(.*\)used memory/Memoria utilizzata            :\1/p	
s/\(.*\)free memory/Memoria libera                :\1/p"

Ovviamente potresti anche usare _awk_.

>
> rm vmstat.info
> rm vmstatn.info

Sono diventate inutili.

Buono studio!
-- 
Sabatino
......
Non voglio i mille baci che diede Lesbia a Catullo,
pochi baci vuole chi riesce a contarli.
				M. Valerio Marziale
				  (versione libera)


More information about the pluto-help mailing list