[risolto] aiuto script bash

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

[risolto] aiuto script bash

Messaggio 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
Ultima modifica di sya54M il gio 12 feb 2009, 20:15, modificato 1 volta in totale.

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio 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).

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio 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

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio 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.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto script bash

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio 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

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio 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.

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: aiuto script bash

Messaggio 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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio 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?

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio 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).

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio 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?

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio da Ansa89 »

Non capisco cosa vuoi fare con

Codice: Seleziona tutto

echo + >> /tmp/$DATE

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio 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

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: aiuto script bash

Messaggio da sya54M »

l'unica soluzione che vedo io è di fare uno script di disconnessione a parte...

Avatar utente
Ansa89
Iper Master
Iper Master
Messaggi: 2703
Iscritto il: mer 29 ago 2007, 17:57
Nome Cognome: Stefano Ansaloni
Slackware: 14.2 64bit
Kernel: 4.9.61
Desktop: XFCE 4.12
Località: Modena

Re: aiuto script bash

Messaggio 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).

Rispondi