[fli4l] Hilfe für?==?utf-8?Q? Skript-Logik
K. Dreier
usenetforum at gmx.net
Mi Feb 22 11:29:08 CET 2017
Hallo Thomas,
zunächst danke für Dein ausführliches und hilfreiches Feedback!
> Das was Du da gebaut hast ist "schlecht": Im ersten IF führst Du
> über
> das Kommando [ den UNIX test Befehl aus (bzw. den entsprechenden
> Ersatz
> in der Shell, je nachdem wie mächtig die Shell ist). Dann im ELIF
> führst
> Du test ein zweites Mal aus. Wenn sich die Existenz der Datei genau
> mit
> der Ausführung des Scripts ändert (das kannst Du leider nicht
> ausschließen), dann wird die Variable device1_online WEDER auf
> false
> noch auf true gesetzt. Genau aus diesem Grund ist es schlecht, weil
>
> dieses Verhalten wahrscheinlich selten auftritt... Eventuell liegt
> hier
> das Problem Deines Scripts.
Hhm. Guter Punkt.
> Im Grunde solltest Du so eine Entscheidung immer wie folgt bauen:
> if test ...; then
> command1
> else
> command2
> fi
Ursprünglich hatte ich dort nur ein "else". Aber da der Plug sowohl
unmotiviert anging als auch ausging wollte ich die Prüf-Logik
"verschärfen". Inbesondere wollte ich, daß es _nicht_ ausgeht, wenn
eine der beiden Bedingungen zutrifft. Da ich aber nicht möchte, daß er
_an_geht, wenn a) der ping negativ ist, aber b)
arping.stat/device1.online (trotzdem) existiert (bei mir funktioniert
das mit arping.stat nicht sauber), möchte ich einen weiteren
Logik-Check haben.
Wie wäre es damit (gehe "positiv"):
if [ $exists -gt 0 ] ; then # only ping successful; this is sufficient =
no further check required to set status to "true"
device1_online="true"
elif [ $exists = 0 ] && [ ! -f /var/run/arping.stat/${device1}.online ]
; then # ping unsuccessful AND no arping.stat file exists for device1;
only then set status to "false"
device1_online="false"
elif [ $exists = 0 ] && [ -f /var/run/arping.stat/${device1}.online ] ;
then # ping unsuccessful BUT arping.stat file (still) exists, then check
for current status of device and set (new) status accordingly
if [ $device1_online = "true" ] ; then # current status of device is
on, leave on; will eventually turn off when file disappears, which is
ok
device1_online="true"
else # device1 is currently set to "false" = offline
device1_online="false" # status is off; arping.stat file could be
merely residual, therefore leave off = "false"
fi
fi
Damit habe ich doch nun alle denkbaren Varianten abgedeckt und keine
"unset"-Situation bliebe übrig, womit ein pures "else" überflüssig
wäre, oder?
> Nutze das Kommando "set -u" am Anfang Deines Scripts, damit Du auf
> falsch geschriebene Variablennamen hingewiesen wirst.
Gibt keine Fehler.
> Wie Peter weiter unten schon angemerkt hat ist ${var}
> besser/sicherer
> als $var: Damit wird $device1.online zu ${device1}.online
Bereits umgesetzt.
> Wenn wie in Deinem Fall ein Test zu wackelig/sensible ist, kannst Du
> ihn
> mehrfach ausführen und eine Mehrheit bilden. Damit eliminierst Du
> Ausreißer auf Kosten der Laufzeit...
> z.B. so:
> #!/bin/sh
>
> set -u
>
> file_to_check=/tmp/x1
>
> check_existance() {
> local i
> local check
> local checks
> i=3
> checks=0
> while test "${i}" -gt 0; do
> check=$(grep -c -i "100% packet loss"
> "${file_to_check}")
> checks=$(expr ${checks} + ${check})
> i=$(expr ${i} - 1)
> sleep 1
> done
> echo ${checks}
> }
>
> exists=$(check_existance)
>
> echo ${exists}
>
> Das ist nur ein Beispiel und muss an Deine Erfordernisse angepasst
> werden.
Das werde ich mir mal anschauen, sobald ich so (siehe oben) nicht weiter
komme. Mein Ping-check erfolgt alle 15 Sekunden, das sollte also
_eigentlich_ solche eine "Redundanz" überflüssig machen. Aber wer
weiß...
Gruß
Klaus
Mehr Informationen über die Mailingliste Fli4L