Nowe posty

Autor Wątek: Po upływie czasu skrypt nie realizuje powierzonych zadań  (Przeczytany 2343 razy)

czeri

  • Gość
Napisałem skrypt, który odwołuje się do pliku dhcp.leases i wykonuje czynności po przydzieleniu bądź zwolnieniu przez dhcp adresu ip.
Dziwna sytuacja występuje po około godzinie działania, a mianowicie, skrypt przestaje realizować powierzone zadania. Skrypt nie zgłasza żadnych błędów ani nic, działa cały czas tylko przestaje rezlizować czynności mu powierzone. Wie ktoś z Was dlaczego tak się dzieję i potrafi mi pomóc w rozwiązaniu tego problemu?
Oto ten skrypt:

#!/bin/bash


DHCPDLEASES="/var/lib/dhcp/dhcpd.leases"


touch "$DHCPDLEASES"
exec 0< "$DHCPDLEASES"


toupper()    # funkcja zamieniająca małe znaki na wielki
{
    local char="$*"
    out=$(echo $char | tr [:lower:] [:upper:])
    local retval=$?
    echo "$out"
    unset out char
    return $retval
}




# go to the end of file
while read line; do
    true;
    done
   
    # process new entries
while true; do
    if read line; then
           # ...
    #    echo "LINE: $line"




    zmienna4=$zmienna4`echo $line | grep 'lease' | awk '{print $2}'`    # wyciągamy adres ip
    zmienna2=$zmienna2`echo $line | grep 'state'| awk '{print $3}'| cut -c 1-6`    #wyciągamy status
    zmienna3=$zmienna3`echo $line | grep 'hardware' | awk '{print $3}' | cut -c 1-17`    #wyciągamy adres mac


    zmienna3=$(toupper $zmienna3)    #sprawiamy by adres mac miał wielki znaki
    zmienna3=`echo $zmienna3 | tr -s : -`


   
    zmienna="Line: $zmienna4 $zmienna2 $zmienna3"    #do zmiennej przypisujemy adres ip, stan oraz oadres mac


    ip=`echo "$zmienna " | grep 'Line' | awk '{print $2 } '`
    if [ $ip <> " " ]
    then
    state=`echo "$zmienna " | grep 'Line' | awk '{print $3}'`
    if [ $state <> " " ]
    then
        mac=`echo "$zmienna " | grep 'Line' | awk '{print $4}'`
        if [ $mac <> " " ]
        then


        echo "$zmienna"
        zmienna4=" ";
        zmienna3=" ";
        zmienna2=" ";
        if [ $state == "free;" ]
        then
            iptables -D FORWARD --source $ip -j ACCEPT        #usuwamy regułę
            iptables -D FORWARD --destination $ip -j ACCEPT    #usuwamy regułę
            iptables -I FORWARD --source $ip -j DROP
            iptables -I FORWARD --destination $ip -j DROP


        else
            echo "update radacct set framedipaddress = '$ip' where acctstoptime IS NULL and callingstationid = '$mac' " | mysql -u root -ppassword radius
            iptables -D FORWARD --source $ip -j DROP
            iptables -D FORWARD --destination $ip -j DROP
            iptables -I FORWARD --source $ip -j ACCEPT
            iptables -I FORWARD --destination $ip -j ACCEPT


        fi
        fi
    fi
    fi


    #-------------------------------------------------------    
    else
    zmienna4=" ";
    zmienna3=" ";
    zmienna2=" ";


        sleep 0.01
    fi


done

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3069
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Po upływie czasu skrypt nie realizuje powierzonych zadań
« Odpowiedź #1 dnia: 2012-02-24, 09:07:53 »
1/ Z tym "sleep 0.01" to po bandzie pojechałeś.
2/ Bash zasadniczo nie służy do pisania daemonów
3/ Zamiast
grep 'Line' | awk '{print $3}'
daj
awk '/Line/{print $3}'
4/ Jeżeli nie używasz jakiś kosmicznych opcji DHCPd to popatrz na DNSMASQ. Tam jest fajna funkcjonalność odpalenia skryptu w chwili przydzielenia, odnowienia i zwolnienia dzierżawy (parametr  --dhcp-script=/ŚCIEŻKA/SKRYPT). Pierwszy parametr przekazany to czynność (add/del/old), drugi to MAC adres "ofiary", trzeci jej IP a opcjonalny czwarty to jej nazwa.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

czeri

  • Gość
Po upływie czasu skrypt nie realizuje powierzonych zadań
« Odpowiedź #2 dnia: 2012-02-25, 20:28:24 »
Cytat: pkraszewski
1/ Z tym "sleep 0.01" to po bandzie pojechałeś.
2/ Bash zasadniczo nie służy do pisania daemonów
3/ Zamiast
grep 'Line' | awk '{print $3}'
daj
awk '/Line/{print $3}'
.
Niestety po zmianie tak jak radziłeś dzieje się to samo, działa do około godziny i się zwiesza.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3069
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Po upływie czasu skrypt nie realizuje powierzonych zadań
« Odpowiedź #3 dnia: 2012-02-26, 17:19:02 »
Zmiana #3 była czysto kosmetyczna (z gatunku tzw "martwych kotów") i nie miała wpływu na działanie skryptu jako takiego...
Zasadniczym problemem jest tu #2. Read my lips - bash nie służy do pisania długo działających daemonów.
Rozwiązaniem problemu jest np. #4.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

czeri

  • Gość
Po upływie czasu skrypt nie realizuje powierzonych zadań
« Odpowiedź #4 dnia: 2012-02-27, 12:10:01 »
Ok dzięki za odpowiedź, będe musiał się przyjżeć temu dnsmasq :)