Fehlercode ein Subcommands (Bezeichnung richtig?)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
lebenskuenstler
Beiträge: 8
Registriert: 15.07.2011 19:47:31

Fehlercode ein Subcommands (Bezeichnung richtig?)

Beitrag von lebenskuenstler » 18.08.2016 22:55:01

Hallo,
ich arbeite gerade an einem Monitoring-Skript, dass stark vereinfacht so aussieht:

Code: Alles auswählen

getValue=`snmpwalk ... | cut | cut | awk '{ print $1 }' `
RESULT=getValue
if [ $RESULT -gt ......] 
Dazu habe ich ein paar Fragen:

1. Wie heißt diese Art von Klammer ` ? (Würde das Googlen erleichtern....)
2. Verstehe ich es richtig, dass wenn ich im Fortgang des Skriptes anstatt mit $RESULT, sondern mit $getValue weiter arbeiten würde, das snmpwalk-Kommando bei jeder Verarbeitung, z.B. in Schleifen, erneut ausgeführt würde?
3. Wie kann ich ermitteln, ob snmpwalk ordnungsgemäß funktioniert hat? Ich kenne die Möglichkeit mit $PIPESTATUS[n] den jeweiligen Fehlercode der einzelnen Pipes sich anzeigen zu lassen. Dies Funktioniert aber nur, wenn ich das Kommando normal ausführe, also weder innerhalb eines awk-Statements oder eben dieser mit namentlich unbekannten Version mit ` , um eine Variable zu befüllen. Ich würde gerne im Skript die Möglichkeit abfangen, dass das Kommando nicht erfolgreich ausgeführt wurde.

Für Hilfe und Anregungen wäre ich sehr dankbar.

Grüße
LK

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Fehlercode ein Subcommands (Bezeichnung richtig?)

Beitrag von heisenberg » 18.08.2016 23:46:31

lebenskuenstler hat geschrieben: 1. Wie heißt diese Art von Klammer ` ? (Würde das Googlen erleichtern....)
Das `...` ist eine Kommandosubstitution. Man kann diese auch so schreiben: $( ... ). Das senkt die Verwirrung aufgrund der Vermeidung der Hochkommata, weil es 3 verschiedene Hochkommata gibt. Anonsten ist das: [ ... ] ein Vergleich ein Alias für das Kommando test. Der erweiterte Test ist der hier [[ ... ]].
2. Verstehe ich es richtig, dass wenn ich im Fortgang des Skriptes anstatt mit $RESULT, sondern mit $getValue weiter arbeiten würde, das snmpwalk-Kommando bei jeder Verarbeitung, z.B. in Schleifen, erneut ausgeführt würde?
Nein. getValue hat das feste Ergebnis von snmpWalk. Wenn Du es erneut ausführen willst, musst Du erneut die Kommandosubstition benutzen.
3. Wie kann ich ermitteln, ob snmpwalk ordnungsgemäß funktioniert hat?
Üblicherweise geben Kommandos einen exit status aus. Zusätzliche Dokumentation, wann welcher Exitcode zurück gegeben wird, findest Du wahrschenlich in der Manpage des Kommandos(man snmpbulkwalk).

Code: Alles auswählen

VARIABLE="$(kommando)"
STATUS=$?
if $STATUS then
  echo "alles ok"
else 
   echo "fehler"
fi

# -oder verkürzt-

if VARIABLE="$(kommando)" then
  echo "alles ok"
else 
   echo "fehler"
fi
Hier ist ein Super Online-Buch zum Thema Shell-Scripting.
http://openbook.rheinwerk-verlag.de/she ... ammierung/

Ansonsten: Du willst wirklich ein SNMP-Monitoring selbst skripten? Da gibt's doch schon genug, was das kann. Z. B. Check_MK: http://mathias-kettner.de/check_mk.html (Gibt's als Opensource-Variante).
Zuletzt geändert von heisenberg am 18.08.2016 23:49:01, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

tobo
Beiträge: 1992
Registriert: 10.12.2008 10:51:41

Re: Fehlercode ein Subcommands (Bezeichnung richtig?)

Beitrag von tobo » 18.08.2016 23:47:52

lebenskuenstler hat geschrieben:1. Wie heißt diese Art von Klammer ` ? (Würde das Googlen erleichtern....)
Die "Klammern" heißen backticks bzw. backquotes und sind die ältere und nicht schachtelbare Version von $(<COMMAND(S)>).
2. Verstehe ich es richtig, dass wenn ich im Fortgang des Skriptes anstatt mit $RESULT, sondern mit $getValue weiter arbeiten würde, das snmpwalk-Kommando bei jeder Verarbeitung, z.B. in Schleifen, erneut ausgeführt würde?
Nein, in getvalue steckt nur die Ausgabe des zugewiesenen Befehls. Das ist statisch.
3. Wie kann ich ermitteln, ob snmpwalk ordnungsgemäß funktioniert hat? Ich kenne die Möglichkeit mit $PIPESTATUS[n] den jeweiligen Fehlercode der einzelnen Pipes sich anzeigen zu lassen. Dies Funktioniert aber nur, wenn ich das Kommando normal ausführe, also weder innerhalb eines awk-Statements oder eben dieser mit namentlich unbekannten Version mit ` , um eine Variable zu befüllen. Ich würde gerne im Skript die Möglichkeit abfangen, dass das Kommando nicht erfolgreich ausgeführt wurde.
Am einfachsten vielleicht mit "set -o pipefail" die Bash selbst dafür benutzen. Der Errorcode ($?)ist dann nicht der Rückgabewert des letzten Befehls in der Pipe, sondern der letzte fehlerhafte Befehl (falls vorhanden). Alternativ: Befehl ausführen, Ergebnis temporär ablegen, prüfen und entsprechend die Pipe weiter abarbeiten.

lebenskuenstler
Beiträge: 8
Registriert: 15.07.2011 19:47:31

Re: Fehlercode ein Subcommands (Bezeichnung richtig?)

Beitrag von lebenskuenstler » 19.08.2016 18:54:23

tobo hat geschrieben: Am einfachsten vielleicht mit "set -o pipefail" die Bash selbst dafür benutzen. Der Errorcode ($?)ist dann nicht der Rückgabewert des letzten Befehls in der Pipe, sondern der letzte fehlerhafte Befehl (falls vorhanden). Alternativ: Befehl ausführen, Ergebnis temporär ablegen, prüfen und entsprechend die Pipe weiter abarbeiten.
Herzlichen Dank, das wars. Das Skript funktioniert nun (endlich) wie es soll.

Code: Alles auswählen

Ansonsten: Du willst wirklich ein SNMP-Monitoring selbst skripten? Da gibt's doch schon genug, was das kann. Z. B. Check_MK: http://mathias-kettner.de/check_mk.html (Gibt's als Opensource-Variante).
Das war ja zum Glück der letzte Schritt. Wir wollten einzelne SNMP-Werte aus einer Tabelle auslesen, dafür habe ich keine Skript/Vorlage gefunden. Außerdem war die ganze Aktion ziemlich lehrreich :) .

Schönes Wochenende !

Benutzeravatar
heisenberg
Beiträge: 3556
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Fehlercode ein Subcommands (Bezeichnung richtig?)

Beitrag von heisenberg » 19.08.2016 19:03:40

Außerdem war die ganze Aktion ziemlich lehrreich :) .
Na das in jedem Fall. :)
Das war ja zum Glück der letzte Schritt. Wir wollten einzelne SNMP-Werte aus einer Tabelle auslesen, dafür habe ich keine Skript/Vorlage gefunden.
Bei Check_MK gibt's dafür "LiveStatus". Dort kann man sich den Kram zu den einzelnen Monitoring-Objekten mit einer Abfragesprache rausziehen. Ob da auch einzelne SNMP-Werte auslesbar sind weiss ich nicht. Damit habe ich selbst jetzt noch nix gemacht.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten