Obliczanie wykorzystanego transferu
Napisał: Patryk Krawaczyński
17/08/2009 w Hacks & Scripts Brak komentarzy. (artykuł nr 129, ilość słów: 533)
P
rzedstawiony zestaw skryptów służy do obliczania wykorzystanego transferu łącza. Autorem skryptu jest Radosław Ryza, który stworzył poniższy zestaw w celu kontroli ilości pobranych danych na łączach posiadających miesięczne lub inne czasowe limity. Jego funkcja polega na obliczeniu dziennej (lub mniejszej czasowo sesji) ilości pobranych danych oraz zapisaniu ich w wybranej lokalizacji. Każda zapisana czasowo sesja jest sumowana z poprzednimi dając wiarygodny wynik w wymiarze np. dnia, tygodnia, miesiąca czy roku. Przed uruchomieniem skryptów w odpowiedniej kolejności należy stworzyć do tego odpowiednie warunki systemowe – czyli stworzenie pliku konfiguracyjnego, z którego będą korzystały skrypty oraz dwóch “baz danych”:
mkdir /etc/counter cd /etc/counter cat > counter.conf << EOF export database_act="/etc/counter/database1" export database_stor="/etc/counter/database2" export start_date="/etc/counter/data" EOF touch data touch database1 touch database2
Pierwszym skryptem, który można nazwać counter_clean.sh wykonuje czynności resetujące bazy danych oraz ustawia początkową datę, od której będą liczone kolejne sesje.
#!/bin/bash . /etc/counter/counter.conf echo -e "0 0" > $database_act echo -e "0\n0" > $database_stor echo -e "`date + "%d-%m-%Y"`" > $start_date
Skrypt ten należy uruchomić za każdym razem (w tym również po raz pierwszy), gdy pragniemy zacząć zliczanie pobranych i wysłanych danych. Drugi skrypt (counter_start.sh) odpowiada za sumowanie danych z obydwu baz. Należy wspomnieć, że pierwszy plik (database1) odpowiada za ilość danych pobranych w bieżącej sesji, drugi natomiast (database2) przechowuje skumulowane wartości z poprzednich sesji. Przy okazji skrypt ten czyści bazę z bieżącą ilością pobranych danych (database1) przygotowując ją dla trzeciego skryptu odpowiedzialnego za samo ich zliczanie. W celu zagwarantowania, że dane będą zliczane przy każdym starcie systemu można dodać wywołanie tego skryptu np. do pliku /etc/rc.d/rc.local:
#!/bin/bash . /etc/counter/counter.conf touch /tmp/lock_counter receive=`cat $database_act | cut -d" " -f 1` transmit=`cat $database_act | cut -d" " -f 2` if [ -f $database_stor ]; then old_receive=`cat $database_stor | sed -n -e "1p"` old_transmit=`cat $database_stor |sed -n -e "2p"` else old_receive=0 old_transmit=0 fi echo $(($receive+$old_receive)) > $database_stor echo $(($transmit+$old_transmit)) >> $database_stor rm /tmp/lock_counter echo "0 0" > $database_act
Trzecim skryptem (counter_count.sh) jest skrypt odpowiedzialny za zliczanie ilości danych w bieżącej sesji. Jego działanie polega na wyborze odpowiednich pól liczbowych z pliku /proc/net/dev/{interfejs} i przekazaniu ich do pierwszej bazy:
#!/bin/bash . /etc/counter/counter.conf i=0 for liczba in `cat /proc/net/dev | grep eth0 | cut -d":" -f2`; do i=$(($i+1)) if [ $i -eq 1 ]; then receive=$liczba elif [ $i -eq 9 ]; then transmit=$liczba fi done if [ -f /tmp/lock_counter ]; then sleep 1 else echo "$receive $transmit" > $database_act fi
W skrypcie tym należy zdefiniować interfejs sieciowy podłączony bezpośrednio do łącza dostarczającego usługę Internetu. Wywołanie tego skryptu można dodać np. do pliku /etc/rc.d/rc.6, w celu podsumowania ilości dotychczasowego transferu. By uniknąć utraty zliczanych danych w przypadku nieprzewidzianego przymusu restartu systemu należy rozważyć możliwość dodania wywołania skryptu do programu crontab – i wywoływania go np. co 1 / 2 minuty. Ostatni skrypt (counter_show.sh) zajmuje się prezentacją zebranych danych:
#!/bin/bash . /etc/counter/counter.conf receive_act=`cut -d" " -f1 $database_act` transmit_act=`cut -d" " -f2 $database_act` receive=`sed -ne "1p" $database_stor` transmit=`sed -ne "2p" $database_stor` echo -e "Bajtów odebranych:\t" $(($receive+$receive_act)) echo -e "MB odebranych:\t\t" $((($receive+$receive_act)/(1024*1024))) echo -e "Bajtów wysłanych:\t" $(($transmit+$transmit_act)) echo -e "MB wysłanych:\t\t" $((($transmit+$transmit_act)/(1024*1024))) echo -e "Data rozpoczęcia zliczania:\t" `cat $start_date`
Prezentacja danych wygląda następująco:
# ./counter_show.sh Bajtów odebranych: 13258923 MB odebranych: 12 Bajtów wysłanych: 860011 MB wysłanych: 0 Data rozpoczęcia zliczania: 11-11-2008
Więcej informacji: www.prook.net