Övervakning.
Moderatorer: Nille, nomicon, Minime
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Övervakning.
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.
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.
-
- Lärling
- Inlägg: 180
- Blev medlem: 02 jul 2005 21:57
- ORT: Datorer
Re: Övervakning.
fsur.sh:
Ä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.
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
Ytterligare ett alternativ är att kolla access-time på filen, men det skulle ge utslag även om man skriver samma värde till filen.
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
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!
Hur gör man då?
Tack så mycket!
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
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?
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
-
- Lärling
- Inlägg: 180
- Blev medlem: 02 jul 2005 21:57
- ORT: Datorer
Re: Övervakning.
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
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 $()
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!
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
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"
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.Hur gör man då?Ytterligare ett alternativ är att kolla access-time på filen, men det skulle ge utslag även om man skriver samma värde till filen.
Kod: Markera allt
ls -l --time-style=+%s "$FIL" | cut -d' ' -f6
* 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!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
Tack så hemskt mycket!
Fick inte riktigt iordning på det dock..
Gjorde på följande enligt ditt första alternativ:
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:
Resultat:
Värdet som skickades in var Nolla
Värde = 1
Nolla
Upplåst!
Värde = 0
Nolla
Låst
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
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
Värdet som skickades in var Nolla
Värde = 1
Nolla
Upplåst!
Värde = 0
Nolla
Låst
-
- Lärling
- Inlägg: 180
- Blev medlem: 02 jul 2005 21:57
- ORT: Datorer
Re: Övervakning.
I din första kodsnutt där är nog problemet i raden
smslarm() skriver ut värdet på $TEST och reagera() ändrar det. Jag misstänker att du vill göra det i omvänd ordning.
Kod: Markera allt
[ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
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!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
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?
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?
-
- Lärling
- Inlägg: 180
- Blev medlem: 02 jul 2005 21:57
- ORT: Datorer
Re: Övervakning.
Genom att göra de två anropen i omvänd ordning. Pröva att kasta omJa precis.. Hur kommer jag ifrån det fenomenet?
Kod: Markera allt
[ $? -ne 0 ] && smslarm && reagera $(cat $FIL | cut -d " " -f 1)
Kod: Markera allt
[ $? -ne 0 ] && reagera $(cat $FIL | cut -d " " -f 1) && smslarm
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.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..
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!
Jag har inget att dölja, och då ska de inte tjuvkika heller!
-
- Administratör
- Inlägg: 567
- Blev medlem: 28 sep 2003 00:14
- ORT: Linköping
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
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!
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!
-
- Allsmäktig
- Inlägg: 354
- Blev medlem: 15 jun 2004 01:56
Re: Övervakning.
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
Sen får man fylla på mer kod om man måste.
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
-
- Allsmäktig
- Inlägg: 226
- Blev medlem: 14 apr 2005 05:36
- ORT: Essunga
Re: Övervakning.
Jag hade tänkt mig nått mer åt detta hållet..
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?
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
Vad igentligen betyder $? i detta sammanhang, är det en variabel för just diff functionen?
-
- Lärling
- Inlägg: 180
- Blev medlem: 02 jul 2005 21:57
- ORT: Datorer
Re: Övervakning.
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å.
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!
Jag har inget att dölja, och då ska de inte tjuvkika heller!