R: R: [PLUTO-help] Cerco aiuto per uno script di shell
Alberto Pachera
alberto.pachera a elletre.com
Mer 4 Ago 2004 08:35:23 CEST
Azz il mio script è da buttare :-(
Cmq grazie dei consigli... Come puoi vedere io arrivo da programmazione
sotto dos e win qunid molti trucchi/comandi della shell bash non li
conosco... Ora vedrò di rimediare un po’ seguendo le tue dritte...
-----Messaggio originale-----
Da: pluto-help-bounces a lists.pluto.it
[mailto:pluto-help-bounces a lists.pluto.it] Per conto di sabpll a libero.it
Inviato: martedì 3 agosto 2004 23.31
A: pluto-help a lists.pluto.it
Oggetto: Re: R: [PLUTO-help] Cerco aiuto per uno script di shell
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)
_______________________________________________
pluto-help mailing list
pluto-help a lists.pluto.it
http://lists.pluto.it/cgi-bin/mailman/listinfo/pluto-help
More information about the pluto-help
mailing list