Pagina 1 di 2
[risolto] aiuto script bash
Inviato: gio 12 feb 2009, 16:29
da sya54M
salve, oggi, avendomi attivato una promozione della 3 (naviga 3), che con 9 euro al mese si hanno 50MB al giorno di traffico, mi stavo facendo uno script che mi autodisconnettesse al raggiungimento dei 50MB:
Codice: Seleziona tutto
#!/bin/bash
# 2009, Andrea Peluso.
DATE=`date +%Y%m%d`
if [ -r /tmp/$DATE/rx_bytes* ]; then
RXBU=`cat /tmp/$DATE/rx_bytes*`
TXBU=`cat /tmp/$DATE/tx_bytes*`
fi
while [ true ]
do
RX=`cat /sys/class/net/ppp0/statistics/rx_bytes`
TX=`cat /sys/class/net/ppp0/statistics/tx_bytes`
if [ -r /tmp/$DATE/rx_bytes* ]; then
BYTETOT=`expr $RX + $TX + $RXBU + $TXBU`
else BYTETOT=`expr $RX + $TX`
fi
echo $BYTETOT
if [ $BYTETOT -ge 52428800 ]; then
cp --backup /sys/class/net/ppp0/statistics/rx_bytes /tmp/$DATE/rx_bytes
cp --backup /sys/class/net/ppp0/statistics/tx_bytes /tmp/$DATE/tx_bytes
sudo killall pppd
exit 0
fi
sleep 5
done
come è evidente però, la mia soluzione è stupida e buggata perchè funziona solo se lo script viene eseguito un massimo di 2 volte al giorno.
mi servirebbe un sugerimento da chi mastica la bash meglio di me.
ps: come si dice a cp di fare i backup numerati invece di usare la ~ ?
grazie infinite per gli eventuali aiuti
Re: aiuto script bash
Inviato: gio 12 feb 2009, 17:38
da Ansa89
Io salverei il contenuto delle variabili "DATE" e "BYTETOT" dentro un file, così all'avvio dello script carichi il contenuto del file e puoi eseguire tutti i controlli del caso (che non sia passato più di un mese e quanti bytes hai già usato).
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:14
da sya54M
Ansa89 ha scritto:Io salverei il contenuto delle variabili "DATE" e "BYTETOT" dentro un file, così all'avvio dello script carichi il contenuto del file e puoi eseguire tutti i controlli del caso (che non sia passato più di un mese e quanti bytes hai già usato).
il bonus di 50MB è giornaliero nel senso che se un giorno non vengono usati, sono persi e il giorno dopo non si hanno 100MB ma comunque 50.
però per bytetot penso che sia una buona idea di metterlo in un solo file in modo da non dover copiare tanti file (e crearmi problemi) come volevo fare io, ora provo e poi faccio sapere.
grazie ansa
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:17
da Ansa89
Non devi creare MOLTI file, te ne basta uno solo (che sovrascriverai fino allo spasmo) dove tieni dentro la data (per sapere se è lo stesso giorno) e i bytes totali usati.
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:29
da targzeta
Due suggerimenti te li do volentieri anche se non mi metto a rivedere tutto:
- Inizializza le variabili RXBU e TXBU a 0 e, se i file esistono le setti al contenuto del file, così ti risparmi questo brutto if
Codice: Seleziona tutto
if [ -r /tmp/$DATE/rx_bytes* ]; then
BYTETOT=`expr $RX + $TX + $RXBU + $TXBU`
else BYTETOT=`expr $RX + $TX`
fi
- L'approccio è sbagliato, nella "cache" non devi salvarti il contenuto attuale, ma i totalie , in questo modo puoi lanciare lo script quante volte ti pare.
- Io invece del comando date utilizzerei 'stat' per trovare la data di ultima modifca dei file e, se il file è vecchio lo cancellerei, in questo modo puoi usare un nome univoco da utilizzare tutti i giorni
Codice: Seleziona tutto
if [ $(stat --printf "%y" file_cache |cut -d' ' -f1) != $(date +"%Y-%m-%d") ]; then rm -f file_cache; fi
il comando precedente lo inserisci all'inizio dello script, così sai che il giorno dopo il file file_cache verrà eiminato.
Spina
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:32
da sya54M
Ansa89 ha scritto:Non devi creare MOLTI file, te ne basta uno solo (che sovrascriverai fino allo spasmo) dove tieni dentro la data (per sapere se è lo stesso giorno) e i bytes totali usati.
ho preferito usare la data come nome del file in cui scrivo i byte (un file per ogni giorno),
Codice: Seleziona tutto
if [ $BYTETOT -ge 52428800 ]; then
cat /sys/class/net/ppp0/statistics/rx_bytes >> /tmp/$DATE
cat /sys/class/net/ppp0/statistics/tx_bytes >> /tmp/$DATE
sudo killall pppd
exit 0
fi
i vari byte vengono aggiunti in colonna nello stesso file, ma ora come li sommo tutti? expr può prendere input da file?
grazie ancora dell'aiuto ansa
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:34
da Ansa89
Però in questo modo dentro i file ci deve essere solo il numero di bytes che hai già usato.
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:36
da targzeta
Ripensandoci basta che nell'unico file di cache ti salvi il totale tra byte inviati e byte scaricati.
All'inizio dello script, setti BYTETOT=0, e dopo aver controllato se il file esiste ed è valido (è di oggi) setti
poi aggiorni BYTETOT con
e dopo il kill
Spina
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:42
da sya54M
spina hai ragione sull'if superfluo che posso eliminare inizializzando a 0 (ora lo faccio)
@ansa: ma vengono tanti valori in colonna, non un solo valore, altrimenti non ci sarebbe il problema, come posso fare?
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:48
da Ansa89
In pratica hai un file dove salvi volta per volta i bytes inviati (o ricevuti).
Allora puoi fare
Codice: Seleziona tutto
BYTESTOT=0
for i in $(cat $NIMEFILE); do
BYTESTOT=$(expr $BYTESTOT + $i)
done
Il ciclo lo fai una volta per i bytes inviati e una volta per quelli ricevuti (attenzione a gestire bene l'inizializzazione di BYTESTOT).
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:55
da sya54M
grazie ad entrambi per l'aiuto!
@ansa: avevo già trovato una soluzione prima di leggere il tuo ultimo post, ho fatto in questo modo:
Codice: Seleziona tutto
#!/bin/bash
# 2009, Andrea Peluso.
DATE=`date +%Y%m%d`
BYTEBU=0
if [ -r /tmp/$DATE ]; then
BYTEBU=`expr $(cat /tmp/$DATE)`
fi
while [ true ]
do
RX=`cat /sys/class/net/ppp0/statistics/rx_bytes`
TX=`cat /sys/class/net/ppp0/statistics/tx_bytes`
BYTETOT=`expr $RX + $TX + $BYTEBU`
echo $BYTETOT
if [ $BYTETOT -ge 52428800 ]; then
echo + >> /tmp/$DATE
cat /sys/class/net/ppp0/statistics/rx_bytes >> /tmp/$DATE
echo + >> /tmp/$DATE
cat /sys/class/net/ppp0/statistics/tx_bytes >> /tmp/$DATE
sudo killall pppd
exit 0
fi
sleep 5
done
non ho ancora avuto modo di testarlo, ma a me sembra che sia apposto ora, voi che ne dite?
Re: aiuto script bash
Inviato: gio 12 feb 2009, 18:58
da Ansa89
Non capisco cosa vuoi fare con
Re: aiuto script bash
Inviato: gio 12 feb 2009, 19:43
da sya54M
ho notato che expr riesce a sommare anche leggendo gli argomenti in questo modo:
quindi inserendo il simbolo + tra una riga e l'altra funziona.
però mi sono reso conto di un problema di fondo

: cioè che il file con i byte in colonna dovrebbe essere scritto alla chiusura della connessione in qualsiasi momento e non solo quando raggiunge i 50mb, altrimenti non serve a nulla
Re: aiuto script bash
Inviato: gio 12 feb 2009, 19:48
da sya54M
l'unica soluzione che vedo io è di fare uno script di disconnessione a parte...
Re: aiuto script bash
Inviato: gio 12 feb 2009, 19:53
da Ansa89
Basta che dentro al costrutto "if" lasci
E porti fuori (prima della condizione) il resto, mettendo il tempo di attesa a 1:
Codice: Seleziona tutto
#!/bin/bash
# 2009, Andrea Peluso.
DATE=`date +%Y%m%d`
BYTEBU=0
if [ -r /tmp/$DATE ]; then
BYTEBU=`expr $(cat /tmp/$DATE)`
fi
while [ true ]
do
RX=`cat /sys/class/net/ppp0/statistics/rx_bytes`
TX=`cat /sys/class/net/ppp0/statistics/tx_bytes`
BYTETOT=`expr $RX + $TX + $BYTEBU`
echo $BYTETOT
echo + >> /tmp/$DATE
cat /sys/class/net/ppp0/statistics/rx_bytes >> /tmp/$DATE
echo + >> /tmp/$DATE
cat /sys/class/net/ppp0/statistics/tx_bytes >> /tmp/$DATE
if [ $BYTETOT -ge 52428800 ]; then
sudo killall pppd
exit 0
fi
sleep 1
done
Così dovresti risolvere (se ho capito come funziona lo script).