Frage zu Bash Script mit Grep Ausgabe

F

Facerolleye

Grünschnabel
Hallo Zusammen,

ich schreibe gerade in Bash ein Script, mit dem ich eine Ausgabe per Grep filtere, nun ist es so - dass ich allerdings zwei Sachen überprüfen muss und wenn diese gegeben sind, soll bspw. ein echo mit irgendwas kommen.

das Grep gibt mir folgendes aus.

Zeit MS
20:01:22,221 1544
20:01:24,449 1200
20:03:12,556 2500

So, ich soll nun überprüfen ob in den letzten 5 Minuten mehr als 3 dieser Zeilen hintereinander aufgetreten sind sowohl als auch nur diese Fehler zählen, dessen MS Wert über 2000 ist.

Leider bin ich etwas überfordert gerade, da ich nicht weiß wie ich das Thema angehen soll.
Irgendjemand eine Lösung? :)
 
Liest Du das aus einer fertigen Datei ein oder kommt das via Pipe aus einem endlos-Stream?

Abgesehen davon würde ich mir eine Sprache auswählen, die wesentlich - nicht besser, aber - einfacher, umkomplizierter mit Timestamps und Arrays umgehen kann.
"Früher" war das perl, heute schlagen irgendwie alle immer python oder sowas vor...
 
Das ganze kommt aus einem endlos-Stream, gilt aber auch für eine fertige Datei (an der ich das gerade austeste)

Ich brauche es leider in Bash, weil das die einzige Sprache ist, die das Programm für welches ich das Skript schreibe liest. :)
 
Ich brauche es leider in Bash, weil das die einzige Sprache ist, die das Programm für welches ich das Skript schreibe liest. :)
Häh? Erklär das bitte mal... Ein System auf dem nur die Bash läuft und sonst nichts?
(oder ist das nur eine besch. Anforderung aus dem Aufgabentext der Hausaufgabe? :-) )

Ansonsten - für mein Empfinden trotz allem die ungeeignetste Sprache, mit der man das lösen können wollte...

Zudem fehlen noch ein paar Randinfos - z.B. wann "genau" "irgendwas" ausgegeben werden soll, sprich die exakte Bed. (min 3x > 2000 hintereinander, 3x > 2000 in den letzten 5m, egal wie viele Werte, ...)
 
naja, ich entwerfe für das Programm "CheckMK" ein Bash Script, welches Fehler analysieren soll, bzw. auswerten soll - diese werden uns dann angezeigt insofern welche gefunden werden.
Leider läuft das ganze dann über ein Plugin welches das Skript liest und das muss (leider) in Bash geschrieben werden.

Angenommen ich greppe nach "Hallo".
nun findet er 10 Einträge mit Hallo welches alle samt Fehler sind. allerdings wird erscheint der Fehler (auf unserem Monitoring Screen) erst wenn 4 Fehler innerhalb von 5 min aufgetreten sind... und dann werden auch nur Fehlereinträge mit > 2000 MS gescannt.

ich habs mir so vorgestellt bzw. versuche es immer noch umzusetzen.
er überprüft Zeile 1,2,3,4 auf MSWert > 2000 und schaut ob das Zeitintervall unter 5 Min beträgt.
Falls nicht, überprüft er Zeile 2,3,4,5 auf MSWert >2000 und schaut dort ob Zeitintervall unter 5 min beträgt.
usw.
Wenn Ja, dann kommt sagen wir mal ein Echo "Fehler gefunden" für Testzwecke
 
Hm, die von mir gefundene Doku zu CheckMK sagt eigentlich, Bash wäre nicht die ideale Sprache, um Plugins zu schreiben - "vorsichtig ausgdrückt" (eigentlich interpretiere ich das eher in Richtung "nimm python, sonst nichts") - ggf. wäre also sinnvoll, hier ein wenig mehr zu der vorhandenen Umgebung und den genutzten Plugins, Konfigs, ... zu schreiben.

Dann wäre es schön zu wissen, was Du denn überwachen willst und warum...

Dann zu der Auswertung:
(a) 1,2,3,4 > 2000 -> Warnung - damit gehe ich konform
(b) 2,3,4,5 > 2000 -> Warnung - aus meiner Sicht nicht sinnvoll. Zum einen ist der Fall grundsätzlich schon durch (a) abgedeckt (sprich die Warnung wurde geschon gemeldet, als 1,2,3,4 > 2000 waren) , zum andern, wenn 1 < 2000 ist, ist es egal, was in der Vergangenheit geschehen ist, da der Warnschwellenwert ja nicht mehr überschritten ist. Ist aber nur meine Interpretation (und wie es üblicherweise gehandhabt wird - ob das sinnvoll ist wäre ggf. zu prüfen.

Da ich CheckMK nicht sooo tief kenne - basiert aber AFAIK auf Nagios / Icinga - würde ich da eh anders machen:
* regelmäßig den Wert abfragen mit einer CheckRate von 1/Min.
* Wert in der Prüfung 4x > 2000 -> Warnung

Nagios / Icinga kann das mit Bordmitteln, ohne irgendein krudes Plugin, welches intern irgendwelche Aufsummierungen macht, bei CheckMK würde auch davon ausgehen (https://mathias-kettner.de/cms_monitoring_basics.html#checkintervall bestätigt das auch)

Das Problem wäre damit eher auf die Lösung reduziert, wie man von dem zu überwachenden Gerät einfach den aktuellen Wert ausliest, der Rest läuft dann innerhalb der Standard-Workflows von CheckMK
 
Wert in der Prüfung 4x > 2000 -> Warnung

Die Historie wird grundsätzlich aufgezeichnet, aber grundsätzlich ist der übermittelte Wert sofort aktiv und wird afaik nur für die Graphen verwendet. D. h. ein Wert wird sofort kritisch und dementsprechend angezeigt.

Würde aber vermuten, dass das auch geht. Habe ich aber noch nicht gemacht. Ggf. mal im monitoring-portal in der check_mk Rubrik nachfragen(http://monitoring-portal.org/, Englisch). Da sind Leute, die sich sehr gut mit Check_MK auskennen.

Ansonsten: Eine Benachrichtigung kann man verzögern, aber der Status(im System/Webinterface) ist erst mal kritisch. Da Check_MK ja Nagios bzw. Icinga nutzt, stelle ich mir die Frage, ob das in Nagios so möglich ist: Status "warn" bzw. "crit" erst nach x checks?

Bei Check_MK gibt es mehrere Arten von eigenen Checks. 2 davon sind:
  • Simple lokale Checks auf den überwachten Zielsystemen(Beliebige Sprache). Die liefern 0,1,2(OK,WARN,CRIT) zurück. Das ist die einfachste Variante von Checks. (Siehe: https://mathias-kettner.com/checkmk_localchecks.html)
  • Agentenbasierte Checks sind ein bisschen komplizierter. Sie haben eine Client-Komponente(Beliebige Sprache) und eine Komponente auf dem Monitoring-Server(Python). Die Checks können automatisiert erkannt werden, wenn Werte auf dem Zielsystem vorhanden sind. (Siehe: https://mathias-kettner.com/checkmk_devel_agentbased.html)
Prinzipiell stimme ich dem, was marce schreibt bzgl. Performance schreibt da natürlich zu: Bash ist in Sachen Geschwindigkeit die schlechteste Wahl. Das normale Intervall für Checks ist 1 Minute. D. h. die von Marce vorgeschlagene Option die vorigen Werte zu prüfen, wäre optimal. Falls das mit der Abfrage der vorigen Werte funktioniert, dann nur mit den agentenbasierten Checks, bei denen eine Komponente auf dem Monitoring-Server ausgeführt wird.

Wenn das nicht geht, dann wäre ein lokaler Check in einer schnellen Scriptsprache meine nächste Empfehlung. Hier wäre meine Wahl dann awk. Die Wahrscheinlichkeit, dass das auf all Deinen Zielplattformen vorhanden ist, ist sehr groß. Ich bin immer wieder erstaunt wie kompakt und performant awk-code ist. Eine hilfreiche Community zu awk findest Du auf www.unix.com (Englisch, Rubrik Shellprogramming and Scripting).

Als Algorithmuss würde ich dann ungefähr so etwas nehmen:
  • Die Datei mit den Werten in umgekehrter Reihenfolge(Ende -> Anfang) untersuchen
  • Prüfen wie viele Werte in Folge über dem Schwellwert(2000) sind
  • Prüfung beim Zeitstempel älter als 5 Minuten abbrechen
 
Wenn Du es Dir einfach machen willst, dann schreibst Du so einen simplen local check: Damit bekommst Du dann sogar einen schönen Graphen geliefert:

Code:
#!/bin/bash

logfile="/path/to/log/file"
# kein logfile -> kein check
[ -f "$logfile" ] || exit 0

read mytime mydata < <(tail -n1 $logfile)

OK=0;WARN=1;CRIT=2
status="%s ms=$mydata MY-MS_Check - Current value: $mydata\n"
if [ mydata -gt 2000 ] ;then
   printf "$status" "$WARN"
else
   printf "$status" "$OK"
fi

Das Script kommt dann nach /usr/lib/check_mk_agent/local. Den/Die betreffenden Hosts nochmal neu inventarisieren, so dass der Check gefunden wird, speichern und core neu starten. (cmk -II host; cmk -R)

Die Benachrichtigung konfigurierst Du dann seperat, so dass dann erst z. B. nach 5 Warnungswerten eine Benachrichtigung geschickt wird.
 
Zurück
Oben