Övervakning.

Här ställer ni allmäna frågor kring Slackware Linux

Moderatorer: Nille, nomicon, Minime

Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Övervakning.

Inlägg av Plutonium »

Sitter och laborerar med sk.a övervakning..
Senario:
Du har en fil, säg /etc/test med värde 1 resp 0 i sig.

Sen har du själva shellscriptet som körs som en deamon och övervaknar denna
test fil om värdet ändrar sig..

Hur skriver man ett kort och enkelt script som fixar detta?

Syftet: För att slippa crond.
Dukeman
Lärling
Inlägg: 180
Blev medlem: 02 jul 2005 21:57
ORT: Datorer

Re: Övervakning.

Inlägg av Dukeman »

fsur.sh:

Kod: Markera allt


#!/bin/bash

# Första argumentet i funktionen är första ordet i filen (nytt värde)
function reagera {
        if [ ${1} -eq 0 ]; then
                echo "Avstängd"
        else
                echo "Igång!"
        fi
}

# Inte lämna skräpfiler kvar
function cleanup {
        rm "$TEMPFIL"
        exit 0
}

# Första argumentet måste vara en fil
[ -z "$1" -o ! -f "$1" ] && echo "fsur.sh <fil>" && exit 1

FIL=$1
TEMPFIL=$(tempfile)

# Hantera ^C och dylikt
trap cleanup SIGHUP SIGINT SIGTERM

cp "$FIL" "$TEMPFIL"

while /bin/true; do
   # Se efter om den gamla kopian skiljer sig från den nuvarande filen
   diff -qs $FIL $TEMPFIL &>/dev/null
   [ $? -ne 0 ] && reagera $(cat $FIL | cut -d " " -f 1)
   cp "$FIL" "$TEMPFIL"
   sleep 1
done
Ändra funktionen reagera() efter eget tycke och smak.

Ytterligare ett alternativ är att kolla access-time på filen, men det skulle ge utslag även om man skriver samma värde till filen.
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Ytterligare ett alternativ är att kolla access-time på filen, men det skulle ge utslag även om man skriver samma värde till filen.

Hur gör man då?

Tack så mycket!
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Jag har "anpassat" koden till mitt syfte, dock med viss komplikation som följd..
Har problem med variabeln $TEST.. Den ger mig fel värde hela tiden och jag förstår inte riktigt varför..
Någon som har nått förslag?

Kod: Markera allt

#!/bin/bash

# Mysql
USER="*******"
PASSWD="******"
DB="1wire"
MYSQL="mysql -u $USER -p$PASSWD -D $DB -e"

# Första argumentet i funktionen är första ordet i filen (nytt värde)
function reagera {
if [ ${1} -eq 0 ]; then

TEST="Låst"
echo "Låst"
$MYSQL "INSERT INTO entredoor (status) VALUES ('låst')"

else

TEST="Upplåst"
echo "Upplåst!"
$MYSQL "INSERT INTO entredoor (status) VALUES ('upplåst')"

fi

}


function smslarm {

if [ $LARM_VALUE -eq 1 ]; then

echo -e "subject:$(date)\n Entre dörren är nu "$TEST | sendmail -f Vakt@Home.nu 073********@sms.comviq.se

fi

}

# Inte lämna skräfiler kvar
function cleanup {
rm "$TEMPFIL"
exit 0
}

# Första argumentet måste vara en fil
[ -z "$1" -o ! -f "$1" ] && echo "overvakning.sh <fil>" && exit 1

FIL=$1
TEMPFIL=$(tempfile)

# Hantera ^C och dylikt
trap cleanup SIGHUP SIGINT SIGTERM

cp "$FIL" "$TEMPFIL"

while /bin/true; do
# Kollar värdet sms alarm
ROWS=`$MYSQL "SELECT value FROM settings WHERE setting='smsalarm'"`
LARM_VALUE=$(echo $ROWS | cut -f2 -d' ')

# Se efter om den gamla kopian skiljer sig från den nuvarande filen
diff -qs $FIL $TEMPFIL &>/dev/null
[ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
cp "$FIL" "$TEMPFIL"
sleep 1
done

Dukeman
Lärling
Inlägg: 180
Blev medlem: 02 jul 2005 21:57
ORT: Datorer

Re: Övervakning.

Inlägg av Dukeman »

Mest troligt beror det på att du definerar variablen TEST och ger den ett värde inuti funktionen reagera(), och försöker läsa den i smslarm().

Det finns två sätt att få ut den data du försöker få ut ur reagera(). Det ena är att definera variablen utanför. Stoppa till exempel in en tilldelning efter de andra "globala" variablerna i början av filen

Kod: Markera allt

PASSWD="******"
TEST="katt i låda"      #Skrivs över så fort det händer något
Det andra alternativet är att skriva ut texten du vill "fånga" i funktionen med echo, och sedan hämta in det vid anropet med $()

Kod: Markera allt

function value {
     if [ $1 -eq 0 ]; then
        echo "Nolla"
     else
        echo "Inte nolla"
     fi
}

TESTVAL=$(value 134)

echo "Värdet som skickades in var $TESTVAL"
Ytterligare ett alternativ är att kolla access-time på filen, men det skulle ge utslag även om man skriver samma värde till filen.
Hur gör man då?
Inte särskilt vackert med tanke på att ls inte nödvändigtvis ger likvärdig output eller har samma flaggor på alla system (särskilt system som använder ls som inte kommer från GNU), men så här kan du få fram timestamp för en fil i UNIX-format som är lätt att jämföra numeriskt.

Kod: Markera allt

ls -l --time-style=+%s "$FIL" | cut -d' ' -f6
Gör en loop som
* Jämför nuvarande timestamp med ett gammalt sparat värde
* Reagerar på nyare (högre) värde
* Sparar nuvarande som gammalt

Som sagt blir det på detta vis ett script som reagerar på en fil som "ändrats" men mycket väl kan ha samma innehåll - tänk på att kontrollera innehållet!
Ta gärna en tur på (länk borttagen av admin då wikin inte finns längre /MDKDIO) också!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Tack så hemskt mycket!

Fick inte riktigt iordning på det dock..
Gjorde på följande enligt ditt första alternativ:

Kod: Markera allt

#!/bin/bash

# Mysql 
USER="******"
PASSWD="*******"
DB="1wire"
MYSQL="mysql -u $USER -p$PASSWD -D $DB -e"
TEST="katt i låda"


# Första argumentet i funktionen är första ordet i filen (nytt värde)
function reagera {
        if [ ${1} -eq 0 ]; then
TEST="Nu är det låst"
                echo "Låst"
	$MYSQL "INSERT INTO entredoor (status) VALUES ('låst')"
		
	else
TEST="Nu är det Upplåst"
               	echo "Upplåst!"
	$MYSQL "INSERT INTO entredoor (status) VALUES ('upplåst')"


        fi

 }

function smslarm {

if [ $LARM_VALUE -eq 1 ]; then
echo $TEST
#echo -e "subject:$(date)\n  Entre dörren är nu "$TEST | sendmail -f Vakt@Home.se 073*******@sms.comviq.se

fi

}

# Inte lämna skräfiler kvar
function cleanup {
        rm "$TEMPFIL"
        exit 0
}

# Första argumentet måste vara en fil
[ -z "$1" -o ! -f "$1" ] && echo "overvakning.sh <fil>" && exit 1

FIL=$1
TEMPFIL=$(tempfile)
 
# Hantera ^C och dylikt
trap cleanup SIGHUP SIGINT SIGTERM

cp "$FIL" "$TEMPFIL"

while /bin/true; do
# Kollar värdet sms alarm
   ROWS=`$MYSQL "SELECT value FROM settings WHERE setting='smsalarm'"`
   LARM_VALUE=$(echo $ROWS | cut -f2 -d' ')

# Se efter om den gamla kopian skiljer sig från den nuvarande filen
   diff -qs $FIL $TEMPFIL &>/dev/null
   [ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
   cp "$FIL" "$TEMPFIL"
   sleep 1
done
Enligt ovanstående fick jag resultat:
Värde = 1
Nu är det låst
Upplåst!

Värder = 0
Nu är det Upplåst
Låst

osv, alltså $TEST har värdet förväxlat mot verkligheten.


Känner att brist på kunskap kan vara felet här med det andra alternativet:

Kod: Markera allt

#!/bin/bash

# Mysql 
USER="*****"
PASSWD="*****"
DB="1wire"
MYSQL="mysql -u $USER -p$PASSWD -D $DB -e"


# Första argumentet i funktionen är första ordet i filen (nytt värde)
function reagera {
        if [ ${1} -eq 0 ]; then

                echo "Låst"
	$MYSQL "INSERT INTO entredoor (status) VALUES ('låst')"
		
	else

               	echo "Upplåst!"
	$MYSQL "INSERT INTO entredoor (status) VALUES ('upplåst')"


        fi

 }

    function value {
         if [[ ${1} -eq 0 ]]; then
            echo "Nolla"
         else
            echo "Inte nolla"
         fi
    }

    TESTVAL=$(value)

    echo "Värdet som skickades in var $TESTVAL"


function smslarm {

if [ $LARM_VALUE -eq 1 ]; then
echo $TEST
#echo -e "subject:$(date)\n  Entre dörren är nu "$TEST | sendmail -f Vakt@Home.se 073*******@sms.comviq.se

fi

}

# Inte lämna skräfiler kvar
function cleanup {
        rm "$TEMPFIL"
        exit 0
}

# Första argumentet måste vara en fil
[ -z "$1" -o ! -f "$1" ] && echo "overvakning.sh <fil>" && exit 1

FIL=$1
TEMPFIL=$(tempfile)
 
# Hantera ^C och dylikt
trap cleanup SIGHUP SIGINT SIGTERM

cp "$FIL" "$TEMPFIL"

while /bin/true; do
# Kollar värdet sms alarm
   ROWS=`$MYSQL "SELECT value FROM settings WHERE setting='smsalarm'"`
   LARM_VALUE=$(echo $ROWS | cut -f2 -d' ')

# Se efter om den gamla kopian skiljer sig från den nuvarande filen
   diff -qs $FIL $TEMPFIL &>/dev/null
   [ $? -ne 0 ] && smslarm && value && reagera $(cat $FIL | cut -d " " -f 1)
   cp "$FIL" "$TEMPFIL"
   sleep 1
done

Resultat:
Värdet som skickades in var Nolla
Värde = 1
Nolla
Upplåst!

Värde = 0
Nolla
Låst
Dukeman
Lärling
Inlägg: 180
Blev medlem: 02 jul 2005 21:57
ORT: Datorer

Re: Övervakning.

Inlägg av Dukeman »

I din första kodsnutt där är nog problemet i raden

Kod: Markera allt

[ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
smslarm() skriver ut värdet på $TEST och reagera() ändrar det. Jag misstänker att du vill göra det i omvänd ordning.
Ta gärna en tur på (länk borttagen av admin då wikin inte finns längre /MDKDIO) också!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Ja precis.. Hur kommer jag ifrån det fenomenet?
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Dukeman, det har tillkommit ett annat problem nu pga att jag inte har övervakat mot rätt fil från början utan har testat det mot en echo 1 resp 0 > test.fil istället..

Filen jag ska övervaka uppdateras ca 5:e sek oavsett om värdet har ändrats eller inte, och detta är ju olidligt när man blir överkört med en massa sms plus en massa onödiga poster i databasen med samma information.

Hur kan man komma ifrån detta?
Dukeman
Lärling
Inlägg: 180
Blev medlem: 02 jul 2005 21:57
ORT: Datorer

Re: Övervakning.

Inlägg av Dukeman »

Ja precis.. Hur kommer jag ifrån det fenomenet?
Genom att göra de två anropen i omvänd ordning. Pröva att kasta om

Kod: Markera allt

[ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
till

Kod: Markera allt

[ $? -ne 0 ] && reagera $(cat $FIL | cut -d " " -f 1) && smslarm
det har tillkommit ett annat problem nu pga att jag inte har övervakat mot rätt fil från början utan har testat det mot en echo 1 resp 0 > test.fil istället..
Genom att antingen inte använda metoden med access time (dvs använda det första förslaget) eller genom att använda en kombination av lösning 1 och lösning 2, som väntar tills filen ändras och sedan kontrollerar om innehållet har ändrats eller inte. Nyckeln här är att enbart "larma" om innehållet har ändrats, vilket du kan kontrollera genom att spara innehållet i en variabel, vänta en stund, jämföra det gamla sparade värdet med det nya innehållet i filen. Detta är precis vad det första scriptet gör, och om du modifierar det som du har gjort så ska smslarm() enbart anropas när värdet i filen har ändrats.
Ta gärna en tur på (länk borttagen av admin då wikin inte finns längre /MDKDIO) också!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
nomicon
Administratör
Inlägg: 567
Blev medlem: 28 sep 2003 00:14
ORT: Linköping

Re: Övervakning.

Inlägg av nomicon »

Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

nomicon väldigt intressant, kommer att ha stor användning av det till senare projekt.
Vill inte konstigt nog fungera till den filen jag försöker övervaka.. Fick det att fungera på en "vanlig" fil men inte den som min api skapar..

Nu har jag efter en hård test och bytt vissa komponenter konstaterat att det är
vajs med min hårdvara.. Och nu har jag förstått var problemet förreligger.

Dukeman, jag har en fråga.
Jo det är så här, värdet i filen jag övervakar har en tidens till att missvissa värde en väldigt kort stund, där problemet förreligger.
Med andra ord är jag ute att efter en kodsnutt där han kollar om värdet har ändrats, (som redan finns) men sen väntar han ett par sek och kollar igen, har värdet ändrats så gör han inget, men däremot har det inte ändrats så skall han köra funktionen reagera och smslarm.
Hur skriver jag in detta i scriptet? Misstänker att det skall vara i while satsen?

Tack på förhand!
lema2.0
Allsmäktig
Inlägg: 354
Blev medlem: 15 jun 2004 01:56

Re: Övervakning.

Inlägg av lema2.0 »

Det finns något i linux som heter inotify. Som lite kort beskrivet gör så att kärnan meddelar när en fil är ändrad. icron som nämns i länken ovan använder nog det.
Annars finns det program att ladda ner på http://inotify-tools.sourceforge.net/
Då kan man göra så här

Kod: Markera allt

#!/bin/bash
while inotifywait -e modify /var/log/logfil; do
        echo "Logfilen logfil är ändrad"
done
Sen får man fylla på mer kod om man måste.
Plutonium
Allsmäktig
Inlägg: 226
Blev medlem: 14 apr 2005 05:36
ORT: Essunga

Re: Övervakning.

Inlägg av Plutonium »

Jag hade tänkt mig nått mer åt detta hållet..

Kod: Markera allt

    while /bin/true; do
    # Kollar värdet sms alarm
       ROWS=`$MYSQL "SELECT value FROM settings WHERE setting='smsalarm'"`
       LARM_VALUE=$(echo $ROWS | cut -f2 -d' ')

    # Se efter om den gamla kopian skiljer sig från den nuvarande filen
       diff -qs $FIL $TEMPFIL &>/dev/null
       if [ $? -ne 0 ]; then          #om filen har ändrats?

	sleep 2                          #vänta

	elif [ $? -eq 0 ]; then  #Kolla igen har filen ändrats, ja det har den?

        exit 1        #Då ska vi inte göra något.

       else 
     #Men har filen inte ändrats så uppdatera databasen det nya värde.
            
       reagera $(cat $FIL | cut -d " " -f 1) && smslarm
       cp "$FIL" "$TEMPFIL"
       sleep 1

      fi

    done
Ja du förstår ju konceptet på vad jag vill utvinna.. Men är inte så haj på shell, men det tar sig det också :).
Vad igentligen betyder $? i detta sammanhang, är det en variabel för just diff functionen?
Dukeman
Lärling
Inlägg: 180
Blev medlem: 02 jul 2005 21:57
ORT: Datorer

Re: Övervakning.

Inlägg av Dukeman »

Variabeln $? innehåller returvärdet från den process som senast startades av detta shell, dvs i mit exempel returvärdet för diff. Jag tror inte ditt senaste script gör vad du vill att det ska göra, eftersom värdet på $? inte ändras mellan kontrollerna i if\elif som dina kommentarer beskriver.
För att få den effekt du beskriver måste du "manuellt" köra diff och spara innehållet som "gammalt" sedan vänta en stund innan kontroll nummer två.
Ta gärna en tur på (länk borttagen av admin då wikin inte finns längre /MDKDIO) också!
Jag har inget att dölja, och då ska de inte tjuvkika heller!