steffan-roh
Anmeldungsdatum: 5. Juni 2014
Beiträge: Zähle...
|
Hallo Forum, bin aboluter anfänger in sachen Linux. Ich bekomme hier eine LOG-Datei "fuellstand.txt" in der folgender Wert gespeichert wird: 5 [Leerzeichen] 50 usw...immer untereinander die fünf ist der Monatstag, die hintere Zahl der Füllstand in Prozent.
Alle zehn minuten wird die LOG-Datei von dem Messprogramm erweitert. ich bräcuhte ein bash-skript welches immer die letzte Zeile ausliest und wenn der Füllstand einen gewissen Wert unterschreitet, soll das skript per wget eine URL aufrufen (SMS-Provider).
Jedoch soll das natürlich nur einmal passieren, danach darf die "Software" erst wieder aktiv werden wenn der Füllstand über dem Grenzwert liegt sonst bekomm ich ja alle halbe Stunde eine SMS.
Ich würde das dann einfach per Cron alle halbe stunde laufen lassen. Klappt sowas?
Wäre euch sehr dankbar da meine Ansätze zu nichts ausser Frustration führen. Bin auch bereit ein paar euros dafür zu blechen. Gute Arbeit soll nicht umsonst sein. viele Grüße Steffan
|
Vibaf
Ehemaliger
Anmeldungsdatum: 27. Dezember 2007
Beiträge: 3046
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | #!/bin/bash
logfile="/path/to/file" # entsprechend anpassen
threshold=50 # entsprechend anpassen
smsText="Wert ist unter ${threshold}." # entsprechend anpassen
url="http://www.example.org" # entsprechend anpassen
errorLog=/tmp/threshold_error.log
value="$(tail -n1 $logfile | cut -d" " -f2)"
# check if the value is a number
if [[ "$value" != *[!0-9]* ]]; then
# check if value is less than the threshold
if [ $value -lt $threshold ]; then
# http-paramter entsprechend anpassen
wget -q "${url}/?text=${smsText}" -O - >/dev/null 2>> $errorLog
fi
else
# if the value is NaN, send an error message
text="Wert ist keine Nummer!"
# http-paramter entsprechend anpassen
wget -q "${url}/?text=${text}" -O - >/dev/null 2>> $errorLog
fi
|
Ich habs nicht getestet. Wenn es nicht funktionieren sollte, kann ich gerne noch mal drüber schaun. Geld brauchst du keines zu vergeben, wir machen das ja alle freiwillig. 😉 Siehe auch Punkt 4 der Portalregeln: Es ist nicht erlaubt, die Plattform für kommerzielle Aktivitäten jeglicher Art sowie Kleinanzeigen, Schenkungen oder als Jobbörse zu benutzen.
Aber es steht dir natürlich frei, im Wiki zu lesen: Spenden 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
steffan-roh schrieb: Herzlich willkommen hier im Forum!
Jedoch soll das natürlich nur einmal passieren, danach darf die "Software" erst wieder aktiv werden wenn der Füllstand über dem Grenzwert liegt sonst bekomm ich ja alle halbe Stunde eine SMS.
Ich würde da eine Hysterese nehmen, damit ein Wert, der um den unteren Stand schwankt nicht ständig zu Meldungen führt. Das ist ein übliches Vorgehen.
Ich würde das dann einfach per Cron alle halbe stunde laufen lassen.
Wenn man eine Hysterese einbaut, ist das einfacher, wenn Du ein Skript die ganze Zeit laufen lässt. Dort nimmt man am besten zwei Schleifen für die beiden Zustände. Beispiel: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | #!/bin/sh
test -n "$DEBUG" && set -x
low=5
high=10
test -r "$1" || { echo "ERROR: no file '$1'" >&2; exit 1; }
tail -n1 -f "$1" | {
val=$((high + 1))
while :; do
# wait for too low
while read -r mon val && [ $val -ge $low ]; do :; done
echo "SMS: too low"
# wait for high enough
while read -r mon val && [ $val -lt $high ]; do :; done
echo "SMS: back to normal"
done
}
|
Wäre euch sehr dankbar da meine Ansätze zu nichts ausser Frustration führen. Bin auch bereit ein paar euros dafür zu blechen. Gute Arbeit soll nicht umsonst sein.
Das ist hier nicht erlaubt, weil es unter Kleinanzeigen & kommerzielle Angebote fällt. Ciao robert
|
steffan-roh
(Themenstarter)
Anmeldungsdatum: 5. Juni 2014
Beiträge: 3
|
Hallo ihr Beiden und erstmal tausend Dank! Das Skript von "Vibaf" läuft und ich hab schon eine Test-SMS bekommen indem ich den Granzwert auf 99% gesetzt hab. Der Tank ist momentan bei 98%, sieht gut aus. Jedoch weis ich nicht, ob die funktion für "nichtstaendigsmsbekommen" schon in Vibaf´s Code integriert ist. Ich finde nichts was danach aussieht.
Wie kann ich die Funktion von dir "rklm" darin einbauen, sodass ich wie du schon sagstest, das Skript staendig laufen lassen kann? - BTW: Wenn ich schon nichts zahlen darf, werd ich nach gelungenem Projekt dem Forum etwas für die ausgezeichnete Hilfe spenden.
|
Vibaf
Ehemaliger
Anmeldungsdatum: 27. Dezember 2007
Beiträge: 3046
|
steffan-roh schrieb: Hallo ihr Beiden und erstmal tausend Dank! Das Skript von "Vibaf" läuft und ich hab schon eine Test-SMS bekommen indem ich den Granzwert auf 99% gesetzt hab. Der Tank ist momentan bei 98%, sieht gut aus. Jedoch weis ich nicht, ob die funktion für "nichtstaendigsmsbekommen" schon in Vibaf´s Code integriert ist. Ich finde nichts was danach aussieht.
Wie kann ich die Funktion von dir "rklm" darin einbauen, sodass ich wie du schon sagstest, das Skript staendig laufen lassen kann?
Jo, sorry - hab ich leider vergessen. Ist mir dann auch wieder eingefallen, als ich rklms post gelesen haben. 😬 Ich habs jetzt auch mal ohne while-Schleife gemacht und nutze eine Datei, um zu überprüfen, ob das Unterschreiten des Schwellwerts bereits gemeldet wurde. Ist nicht so schön wie rklms Ansatz und benötigt cron . 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | #!/bin/bash
logfile="/path/to/file" # entsprechend anpassen
threshold=50 # entsprechend anpassen
smsText="Wert ist unter ${threshold}." # entsprechend anpassen
url="http://www.example.org" # entsprechend anpassen
errorLog=/tmp/threshold_error.log
lockFile=/tmp/value_reported
value=$(tail -n1 -f $logfile | cut -d" " -f2)
# check if the value is a number
if [[ "$value" != *[!0-9]* ]]; then
# check if value is less than the threshold and the lock file doesn't exist
if [ $value -lt $threshold ] && [ ! -f $locktFile ]; then
# http-paramter entsprechend anpassen
wget -q "${url}/?text=${smsText}" -O - >/dev/null 2>> $errorLog
touch $lockFile
fi
# if the value is greater or equal the threshold again, remove the lock file
if [ -f $lockFile ] && [ $value -ge $threshold ]; then
rm $lockFile
fi
else
# if the value is NaN, send an error message
text="Wert ist keine Nummer!"
# http-paramter entsprechend anpassen
wget -q "${url}/?text=${text}" -O - >/dev/null 2>> $errorLog
fi
|
|
steffan-roh
(Themenstarter)
Anmeldungsdatum: 5. Juni 2014
Beiträge: 3
|
Habe das als Ausgabe ./alarm.sh: line 29: unexpected EOF while looking for matching "'
./alarm.sh: line 31: syntax error: unexpected end of file
liegts an mir?
|
Vibaf
Ehemaliger
Anmeldungsdatum: 27. Dezember 2007
Beiträge: 3046
|
Wie sieht denn dein Script jetzt aus? Ist beim Copy-Paste vielleicht ein " o.ä. verloren gegangen?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Vibaf schrieb:
Ich habs jetzt auch mal ohne while-Schleife gemacht und nutze eine Datei, um zu überprüfen, ob das Unterschreiten des Schwellwerts bereits gemeldet wurde.
Ja, ohne die Schleife braucht man einen persistenten Speicher. Obwohl, ich habe da noch eine Idee...
Ist nicht so schön wie rklms Ansatz und benötigt cron .
Ich würde das nicht als Nachteil ansehen, dass man das mit cron macht. Dann hat man keinen Prozess, der die ganze Zeit läuft und cron kümmert sich um die regelmäßige Ausführung.
| value=$(tail -n1 -f $logfile | cut -d" " -f2)
|
Du willst das "-f" hier beim tail nicht, denn Du wartest ja nicht auf neue Daten in der Datei.
| # check if the value is a number
touch $lockFile
...
rm $lockFile
|
Wenn Du ein "Lockfile" verwendest, dann ist aber eher flock das Mittel der Wahl. Wenn das Skript öfters läuft als die Aktualisierung in der Datei, kann man es so machen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | #!/bin/sh
test -n "$DEBUG" && set -x
low=5
high=10
test -r "$1" || { echo "ERROR: no file '$1'" >&2; exit 1; }
dat=$(tail -2 "$1" | cut -d ' ' -f 2 | paste -d ' ' -s)
v1=${dat%% *}
v2=${dat##* }
if [ $v1 -ge $low -a $v2 -lt $low ]; then
echo "SMS: too low"
elif [ $v1 -lt $high -a $v2 -ge $high ]; then
echo "SMS: back to normal"
fi
|
Dieses Skript nutzt die Historie in der Datei aus, indem die letzten zwei Zeilen gelesen werden. Damit kommt man ohne separate Datei aus. Problem ist, wenn die Datei öfters aktualisiert wird als das Skript läuft, sieht man den Übergang über den jeweiligen Schwellwert wahrscheinlich nicht. In dem Fall ist eine separate Datei für den zuletzt gelesenen Wert robuster: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | #!/bin/sh
test -n "$DEBUG" && set -x
low=5
high=10
test -r "$1" || { echo "ERROR: no file '$1'" >&2; exit 1; }
cmd="$(basename "$0")"
lockfile="/var/run/$cmd"
exec 9<>"$lockfile"
flock -n 9 || {
echo "ERROR: already running - exiting." >&2
exit 1
}
v1=$(sed -nre '1 s#^[^[:digit:]]*([[:digit:]]*)[^[:digit:]]*$#0\1#p' <&9)
v2=$(tail -1 "$1" | cut -d ' ' -f 2)
echo $v2 >|"$lockfile"
if [ $v1 -ge $low -a $v2 -lt $low ]; then
echo "SMS: too low"
elif [ $v1 -lt $high -a $v2 -ge $high ]; then
echo "SMS: back to normal"
fi
|
Ich habe außerdem mal das Locking eingefügt um mehrfache parallele Ausführung zu verhindern.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi Steffan, erstmal auch von mir ein herzliches Willkommen ! Du schreibst, dass Dein System alle 10 Min. einen Messwert an die Log-Datei anhängt ... Da wäre es doch eine ganz reizvolle Variante, dieser Datei einfach mit einem tail -f zu folgen (→ man tail ) und die Ausgabe mit dem Skript direkt davon zu lesen und ggf. zu reagieren. Dann ist das Timing schon erledigt. Also diesen Aufruf: tail -fn1 xxxxxxxxxxxxx24.log | ./sms_melder mit diesem Skript sms_melder : 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | #!/bin/bash
schwelle=50
hysterese=2
smsText="Wert ist unter ${schwelle}." # entsprechend anpassen
url="http://www.example.org" # entsprechend anpassen
while read ; do
if [ "$gesendet" == 1 ]; then
if [ ${REPLY##* } -gt $((schwelle + hysterese)) ]; then
gesendet=0
fi
else
if [ ${REPLY##* } -lt $schwelle ]; then
wget -q "${url}/?text=${smsText}" -O - # oder wie auch immer der Aufruf aussehen muss
gesendet=1
fi
fi
done
|
Hier reicht eine Merkvariable "$gesendet" aus, um Mehrfachmeldungen zu unterbinden. Erläuterungen zu den einzelnen Befehlen findest Du im Scripting-Wiki, unter help read und unter "Parameter Expansion". LG, track
|
Vibaf
Ehemaliger
Anmeldungsdatum: 27. Dezember 2007
Beiträge: 3046
|
rklm schrieb: Vibaf schrieb:
Ich habs jetzt auch mal ohne while-Schleife gemacht und nutze eine Datei, um zu überprüfen, ob das Unterschreiten des Schwellwerts bereits gemeldet wurde.
Ja, ohne die Schleife braucht man einen persistenten Speicher. Obwohl, ich habe da noch eine Idee...
Ist nicht so schön wie rklms Ansatz und benötigt cron .
Ich würde das nicht als Nachteil ansehen, dass man das mit cron macht. Dann hat man keinen Prozess, der die ganze Zeit läuft und cron kümmert sich um die regelmäßige Ausführung.
War auch nicht als Nachteil gemeint, lediglich als Hinweis.
| value=$(tail -n1 -f $logfile | cut -d" " -f2)
|
Du willst das "-f" hier beim tail nicht, denn Du wartest ja nicht auf neue Daten in der Datei.
Copy-pasta und umschreiben des Codes 🙄 Danke für den Hinweise. ☺
| # check if the value is a number
touch $lockFile
...
rm $lockFile
|
Wenn Du ein "Lockfile" verwendest, dann ist aber eher flock das Mittel der Wahl.
Okay. Müsste dann wie folgt aussehen, oder? Muss ich mir noch mal genauer anschauen. 1
2
3
4
5
6
7
8
9
10
11
12 | ...
if [ $value -lt $threshold ] && [ $(flock -n $lockFile) ] ; then
# http-paramter entsprechend anpassen
wget -q "${url}/?text=${smsText}" -O - >/dev/null 2>> $errorLog
flock -x $lockFile
fi
...
# if the value is greater or equal the threshold again, remove the lock file
if [ ! $(flock -n $lockFile) ] && [ $value -ge $threshold ]; then
flock -u $lockFile
fi
...
|
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Vibaf schrieb: rklm schrieb:
Wenn Du ein "Lockfile" verwendest, dann ist aber eher flock das Mittel der Wahl.
Okay. Müsste dann wie folgt aussehen, oder? Muss ich mir noch mal genauer anschauen.
Nein, schau auf die Manpage, auf meine Benutzerseite oder in das Skript. Ich habe noch eine kleine Macke bereinigt: der reguläre Ausdruck in Zeile 20 war nicht ganz robust. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 | #!/bin/sh
test -n "$DEBUG" && set -x
low=5
high=10
test -r "$1" || { echo "ERROR: no file '$1'" >&2; exit 1; }
cmd="$(basename "$0")"
lockfile="/var/run/$cmd"
exec 9<>"$lockfile"
flock -n 9 || {
echo "ERROR: already running - exiting." >&2
exit 1
}
v1=$(sed -nre '1 s#^[^[:digit:]]*([[:digit:]]*).*$#0\1#p' <&9)
v2=$(tail -1 "$1" | cut -d ' ' -f 2)
if [ $v1 -ge $low -a $v2 -lt $low ]; then
echo "SMS: too low"
elif [ $v1 -lt $high -a $v2 -ge $high ]; then
echo "SMS: back to normal"
fi
echo $v2 >|"$lockfile"
|
Außerdem habe ich den Update des Speichers ganz ans Ende gepackt. Falls etwas beim SMS verschicken schief gehen sollte, kann man dann vorher beenden und beim nächsten Test wird nochmal die Änderung gegenüber dem selben Wert getestet, damit man keinen Übergang verpasst. Ciao robert
|