[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