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 totali

    Codice: Seleziona tutto

    $RX + $RXBU 
    e

    Codice: Seleziona tutto

    $TX + $TXBU
    , 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

Codice: Seleziona tutto

expr $(cat $NOMEFILE1) + $(cat $NOMEFILE2)
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

Codice: Seleziona tutto

BYTETOT=`cat file_cache'
poi aggiorni BYTETOT con

Codice: Seleziona tutto

BYTETOT=`expr $BYTETOT + $RX + $TX`
e dopo il kill

Codice: Seleziona tutto

echo $BYTETOT > file_cache
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

Codice: Seleziona tutto

echo + >> /tmp/$DATE

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:

Codice: Seleziona tutto

2
+
2
quindi inserendo il simbolo + tra una riga e l'altra funziona.

però mi sono reso conto di un problema di fondo :oops: : 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

Codice: Seleziona tutto

sudo killall pppd
exit 0
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).