Newsgroup: it.comp.os.linux.iniziare
Titolo: Comando simile a if then

Livello di conoscenza del mondo linux: simile a zero, quindi:
Mensilmente faccio un backup di linux su di una partizione senza mai cancellare i vecchi salvataggi.
A lungo andare, naturalmente, questa partizione verrà inevitabilmente saturata.
La domanda: è possibile, con crontab, verificare lo spazio utile della partizione ed eventualmente avvisarmi se sotto una certa soglia?
Esempio: if (spazio di /media/backup)<5GB then (un qualsiasi avviso).
Come si può fare?
Grazie
-- 
Marco DM

 Esempio: if (spazio di /media/backup)<5GB then (un qualsiasi avviso).
Dirotta le E-Mail di sistema (A noi sconosciuto) al tuo utente.
-- 
#include <std.disclaimer.h>
Signature automatica inserita a mano.
In God we trust, all others we monitor.(NSA)
Punteggiatura: Nel caso mancasse nel messaggio, aggiungete!!

 Esempio: if (spazio di /media/backup)<5GB then (un qualsiasi avviso).
Quella che segue è un'unica riga
if [ $( df -B 1M /media/backup | tail -1 | awk '{print $2}' ) -lt 5000 ] 
; then echo "ciao" ; fi
Al posto di
   echo "ciao"
metti il comando che più ti aggrada. Ad esempio (di nuovo, un'unica riga):
   echo "Lo spazio sta per esaurirsi" | mail -s
   "Occhio allo spazio" ti...@da.qualche.part.te
Il comando risultante lo mette in crontab e lo fai eseguire con la 
cadenza che preferisci.

   "Occhio allo spazio" ti...@da.qualche.part.te
Semplifichiamo:
echo "Lo spazio sta per esaurirsi" | mail utente
Con, al posto di utente il nome del tuo utente su quella macchina.


 cadenza che preferisci.
Non è meglio utilizzare logrotate a sto punto?
-- 
Vide

 
Sicuramente inutile, ma è solo per incominciare a capire un po' meglio il lingiaggio con linux.
25 anni fà circa mi divertivo con il Basic e adesso vedo se capisco qualcosa con linux.
-- 
Marco DM

 cadenza che preferisci.
Un ulteriore precisazione da principiante: quando parli di "comando" intendi che devo copiare il tutto in un crontab
 oppure creo un programmino (Es. di nome Marco) che ha quelle caratteristiche e lo avvio con crontab?
Grazie
-- 
Marco DM

 Perfetto; hai mica due minuti di tempo per spiegarmelo?
Due minuti non bastano ;-)
Scritto su più righe:
if [ $(df -B 1M /media/backup|tail -1|awk '{print $2}') -lt 5000 ]
then
   echo "ciao"
fi
Vediamolo a grandi linee:
   if ESPRESSIONE ; then COMANDO1; ... ; fi
Punto e virgola è un separatore di comandi. Può essere sostituito con 
un'andata a capo. ESPRESSIONE nel nostro caso è:
   [ VALORE -lt NUMERO ]
dove -lt sta per "less than".
Il costrutto $(...) viene sostituito dall'output del comando eseguito 
tra tonde. Per intenderci, guarda l'espressione:
   if [ $(COMANDO) -lt 5000 ] ; then echo "ciao" ; fi
Questa viene valutata. Se COMANDO produce come output 1234, allora verrà 
eseguito:
   if [ 1234 -lt 5000 ] ; then echo "ciao" ; fi
Il risultato sarà la scritta ciao. Nel nostro caso il comando è
   df -B 1M /media/backup | tail -1 | awk '{print $2}'
Si tratta di una pipeline. I segmenti di questa pipeline sono vari 
comandi. Schematicamente:
   A | B | ... | Z
Il comando A produce un output che viene passato come input al comando 
B, che a sua volta produce un output che viene passato al comando C, e 
così via. I nostri segmenti della pipeline sono:
   (1) df -B 1M /media/backup
   (2) tail -1
   (3) awk '{print $2}'
(1) ci dice quanto spazio libero (in blocchi da 1Mb) c'è su 
/media/backup. (2) estrae l'ultima riga dell'output di (1). Infine (3) 
stampa solo la seconda "parola" dell'output di (2).
Da notare awk: è un vero e proprio linguaggio per il text processing.
Spero di non averti confuso ulteriormente le idee.

 Non è meglio utilizzare logrotate a sto punto?
Dato il tipo di cadenza probabilmente sì.

 fi
Se opti per uno script invece che inserire direttamente il codice nel 
crontab puoi pure pensare a qualcosa di più sofisticato (così impari 
qualche altra possibilità dello scripting sotto *nix):
#!/bin/bash
# Personalizzazione
filesystem=/media/backup
soglia=5000
subject="Ricordati che devi morire"
destinatario=tuoac...@dove.ti.pare
# Procedura
spaziolibero=$(df -B 1M $filesystem|tail -1|awk '{print $2}')
if [ $spaziolibero -lt $soglia]
then
   echo "Ci sono solo $spaziolibero MB liberi su $filesystem." | \
   mail -s $subject $destinatario
fi
(non so se funge, ho scritto alla cieca)

 Spero di non averti confuso ulteriormente le idee.
Confessa: tu insegni.
Oppure, stai ancora studiando[*] e hai assorbito il metodo.
[*] Nel senso scolastico, ovvero hai qualcuno che ti insegna.
Anche adesso che ho passato il mezzo secolo, continuo a studiare,
ma e' diverso. ;-)
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 Confessa: tu insegni.
Ebbene sě, mi hai sgamato!


Premesso che potresti anche avermi preso per i fondelli, posso chiedere
che branca dello scibile umano e/o inumano insegni?
Materia tecnica, scientifica, umanistica?
Nel caso mi avessi preso per i fondelli, beh, mi dispiace per i tuoi
mancati discepoli, avrebbero avuto un insegnante in grado di farsi
capire in modo scorrevole, ed e' merce rara, per quel che so.


 capire in modo scorrevole, ed e' merce rara, per quel che so.
Grazie, troppo buono.
P.S.
Pure io studio ancora: tenersi aggiornati č necessario come il pane!

 if [ $spaziolibero -lt $soglia ]
aggiungo qualcosa[1] : if controlla il valore di ritorno di un programma e 
controlla che sia diverso da zero (mi pare); il programma da cui if legge è 
quello che segue if stesso.
quadra aperta ([) è in effetti un alias per il programma 'test'
quindi quello che segue if è sostanzialmene una linea di comando
if PROGRAMMA ARG1 ARG2 .. ARGn
then
   (...)
fi
la parentesi quadra chiusa ( [ ) è a tutti gli effetti un argomento del 
programma test che è pensato però per ignorarla.
E' per questo che è necessario mettere uno spazio dopo la quadra aperta e 
prima della quadra chiusa; nella riga
if [qualcosa da fare]
si avrà un errore, perché la shell cercherà il programma '[qualcosa' a cui 
passare gli argomenti 'da' e 'fare]' (notare la quadra chiusa) 
ecco perché ad esempio if [ ciao -eq ciao] valuta false (perché "ciao" è 
diverso da "ciao]")! ed ecco anche perché -eq assomiglia a un parametro di 
un programma: in effetti lo è
ed ecco infine perché il then può apparire solo a capo o sulla stessa riga 
ma preceduto da un punto e virgola: il punto e virgola separa i comandi di 
shell (come in "cd miadir; ls" )
if [ $a -eq $b ]; then
...
fi
[1] quello che dico qui potrebbe non valere per bash
-- 
NoWhereMan (e.v.)
-- 
http://www.nowhereland.it
-- 
http://www.flatpress.org

 quadra aperta ([) è in effetti un alias per il programma 'test'
Su Debian c'è in /usr/bin:
$ ls /usr/bin/\[
/usr/bin/[
$ file /usr/bin/\[
/usr/bin/[: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for
GNU/Linux 2.6.8, dynamically linked (uses shared libs), stripped
$
:)
-- 
 . ''`.  Debian maintainer | 
http://wiki.debian.org/DavidPaleino
 : :'  : Linuxer #334216 --|-- 
http://www.hanskalabs.net/
 `. `'`  GPG: 1392B174 ----|---- 
http://snipr.com/qa_page
   `-   2BAB C625 4E66 E7B8 450A C3E1 E6AA 9017 1392 B174

 Grazie, troppo buono.
Macche' bonta', io sono bastardo dentro, fuori, e anche tutt'intorno.
E' invidia, null'altro che invidia.
Invidia su due livelli:
Da studente di allora, e da pseudo-docente poi.
Da studente: Avessi avuto docenti (beh, devo dire _più_ docenti, che'
qualcuno lo avevo) cosi', avrei fatto meno fatica, in certi corsi.
Da pseudo-docente: Anch'io ho tenuto corsi, e per tanti anni ho fatto
formazione alla clientela su specifici applicativi, o genericamente di
informatica generale, ma quell'esposizione te l'ho invidiata, ecco! ;-)
Io l'avrei spiegata, probabilmente, con il doppio di righe, e in modo
il doppio meno chiaro.
Ok, adesso rimetto il violino nella custodia. Buona serata.




Per confondere le idee bisognerebbe averne qualcuna.
Se ti dicessi che ho capito tutto sarei un gran bugiardo; diciamo un 30 - 40 %.
Sono comunque soddisfatto. Mi studio il tutto, ripasserò e ripasserò sino ad arrivare ad un 75%,
sarei, quindi molto soddisfatto.
Grazie ancora
-- 
Marco DM

 Su Debian c'è in /usr/bin:
opporc... :P
però il discorso vale lo stesso :P
