Gelöst! Shell Skript für systemd Überwachung

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Gelöst! Shell Skript für systemd Überwachung

Beitrag von Nastra » 26.02.2018 14:37:08

Hallo zusammen,

ich bräuchte mal wieder eure Hilfe und zwar benutze ich "DEBIAN STRETCH WITH RASPBERRY PI DESKTOP" dort habe ich einen Service (systemd) eingerichtet der andere Service überwacht und bei Ausfall von einem dieser mir anhand meines Skripts für alle überwachten Service eine Push Nachricht über die Software ntfy an Telegram Messenger sendet.

github.com/dschep/ntfy

Das funktioniert auch soweit ganz gut.

Jetzt zu meiner Idee bzw. meinem Problem. Ich würde gerne im Skript unterscheiden wenn Service X Ausgefallen dann sende mir Nachricht X, wenn Service Y Ausgefallen dann sende mir Nachricht Y um zu unterscheiden welcher genau ausgefallen ist.

Möchte ungern für jeden Service den ich Überwache möchte einen eigenen Überwachungsservice einrichten.

Meint ihr das ist möglich? Wenn ja wie?


Hier mein aktuelles Skript:

Code: Alles auswählen

#!/bin/bash 
journalctl --unit homebridge* -f --since "now" | 
grep --line-buffered "exited" | 
sudo -u pi xargs -L1 -I '#' ntfy -b telegram send 'Homebridge Instanz ausgefallen'
In der ersten Zeile hinter unit könnte ich den genauen Namen des überwachten Service angeben, sowie in der zweiten Zeile bei exited was genau überwacht wird auch. Jetzt ist es halt so das er alles überwacht und immer die gleiche Push versendet wird.

Ich hoffe es ist nachvollziehbar?

Vielen Dank

Gruß Nastra
Zuletzt geändert von Nastra am 03.03.2018 18:38:14, insgesamt 5-mal geändert.

TomL

Re: Bash Skript für systemd Überwachung

Beitrag von TomL » 26.02.2018 17:49:01

Eigentlich kann systemd sowas schon von hause aus. Siehe "restart=on-failure" in 'man systemd.service" , um einen gestorbenen Prozess automatisch neu zu starten. Oder alternativ, siehe "OnFailure=" in 'man systemd.unit'

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 26.02.2018 17:56:18

Hey, vielen Dank für die Antwort.

Ja in denn Units die Überwache ist der Restart auch eingetragen nach 10 Sek. Mir geht es halt darum auch eine Push zu bekommen wenn ein Service ausfält für jeden Service einzeln der Überwacht wird.

Zurzeit ist es so das ich eine Push bekomme die immer gleich ist egal welche Service gestoppt ist.

Ich dachte man kann das Skript vieleicht mit if etc. erweitern. Blicke da aber nicht ganz durch.
Zuletzt geändert von Nastra am 27.02.2018 07:17:34, insgesamt 1-mal geändert.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Skript für systemd Überwachung

Beitrag von NAB » 26.02.2018 18:57:24

Ich verstehe nicht, was das -I '#' da macht. Das # wird danach doch gar nicht mehr benutzt. Was passiert denn, wenn du das # einfach in den zu sendenden String einfügst?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: Bash Skript für systemd Überwachung

Beitrag von TomL » 26.02.2018 19:18:31

Nastra hat geschrieben: ↑ zum Beitrag ↑
26.02.2018 17:56:18
Zurzeit ist es so das ich eine Push bekomme die immer gleich ist egal welche Service gestoppt ist.
Ich dachte man kann das Skript vieleicht mit if etc. erweitern. Blicke da aber nicht ganz durch.
Wie ich sagte: "Oder alternativ, siehe "OnFailure=" in 'man systemd.unit'"

Man richtet in den infrage kommenden Service-Units jeweils dieses OnFailure-Statement ein und ruft damit eine instantiierte weitere Unit auf, mit übergabe des Problemservices, um mit der zweiten Unit dann eine individuelle Nachricht zu senden. Diese zweite Unit erledigt den Job für alle Services, kriegt aber vorher die Mitteilung, welcher Dienst gestorben ist.

Ich glaube, Du würdest uns allen einen Gefallen tun, wenn Du keine Geheimsprache verwenden würdest. Als ich "Zurzeit ist es so das ich eine Push bekomme " gelesen habe, war mein erster Gedanke "tut das nicht weh..?... da würde ich mich aber schleunigst in Sicherheit bringen". Wenn ich das nun richtig verstehe, ist damit gemeint, dass irgendeine Maschine eine Nachrichtet sendet und irgendein Empfänger-Gerät via Push-Service diese Nachricht unaufgefordert auf dem Display anzeigt. Meinst Du das?

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Bash Skript für systemd Überwachung

Beitrag von breakthewall » 26.02.2018 19:24:21

Bin gerade unterwegs, daher nicht getestet:

Code: Alles auswählen

#!/bin/bash


message1="Homebridge Instanz ausgefallen"
message2="Service X Instanz ausgefallen"

send-message() {
sudo -u pi xargs -L1 -I '#' ntfy -b telegram send
}

service-check() {
journalctl -f --since "now" | 
grep -E "exited" | grep -E "homebridge|Service X"
}

if [[ service-check =~ homebridge ]]
  then
      send-message "$message1"
elif [[ service-check =~ Service X ]]
    then
        send-message "$message2"
fi

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 26.02.2018 19:37:11

ch verstehe nicht, was das -I '#' da macht. Das # wird danach doch gar nicht mehr benutzt. Was passiert denn, wenn du das # einfach in den zu sendenden String einfügst?
Passiert nichts, habe es jetzt entfernt. Muss dabei sagen das ich das Skript im Internet gefunden habe und nur geringfügig angepasst habe. Meine Erfahrungen was Skripte angeht liegen bei fast 0 %.
Ich glaube, Du würdest uns allen einen Gefallen tun, wenn Du keine Geheimsprache verwenden würdest. Als ich "Zurzeit ist es so das ich eine Push bekomme " gelesen habe, war mein erster Gedanke "tut das nicht weh..?... da würde ich mich aber schleunigst in Sicherheit bringen".
Das war vielleicht etwas unglücklich Formuliert, ist halt immer so eine Sache unterwegs mal schnell vom Handy Antworten. Leider bleibt manchmal die Formulierung etwas auf der Strecke, auch wenn es nicht so sein sollte.

Aber verstanden hast du es :THX:

Wenn ich dich richtig verstanden habe, könnte ich in der Unit die onFailure eintragen und dort den Befehl (Zeile 4) aus dem Skript für das Senden der Nachricht = Push :lol: auf mein Mobiltelefon verwenden? Damit wäre das Skript dann überflüssig?
Zuletzt geändert von Nastra am 26.02.2018 19:46:12, insgesamt 1-mal geändert.

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 26.02.2018 19:40:32

@breakthewall

Cool, das sieht genau nachdem aus was ich gesucht habe. Ich werde es nachher testen und mich wieder melden. Vielen Dank!

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Skript für systemd Überwachung

Beitrag von NAB » 26.02.2018 20:13:13

Komisch.

Hier:
https://forum.smartapfel.de/forum/threa ... h-systemd/
erklärt dein Namensvetter das Script noch zeilenweise.

Und hier:
https://limond.de/send-systemd-journal- ... gram-chat/
scheint das Original herzustammen. Und dort funktioniert es so, wie ich sagte.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 26.02.2018 20:45:26

Habe nicht behauptet das es aus meiner Feder stammt, ja ich habe auch diese Anleitung geschrieben trotzdem habe ich von Skripten nicht wirklich viel Ahnung, habe mit viel Zeit und Mühe es irgendwie hinbekommen das es überhaupt funktionierte, da die Anleitung bei limond.de leider nicht 1 zu 1 funktioniert hat wie erhofft.

Musste ewig testen und ausprobieren bis sich die Unit zusammen mit dem Skrip aktivieren ließ und das bei vier Zeilen, daher halte ich so Erfolge dann auch gerne fest das andere auch was davon haben.

Alles learning bei doing und gerne auch mal hilfe wenn es zu kompliziert wird.

Jetzt habe ich irgendwie das Gefühl das ich mich ertappt fühlen soll oder warum schreibst du das so vorwurfsvoll?

Ich hätte ich euch nicht nach hilfe gebeten, wenn ich wüsste wie ich das Skript umschreibe kann bzw. es noch andere Lösung dafür gibt?

Wenn du mal Support für dein Apple SmartHome brauchst kann ich dir auch gerne mal unter die Arme greifen. :D

Einen hast du eh noch gut bei mir, da du mir ja schonmal weitergeholfen hast :THX:

@breakthewall Das Skript funktioniert leider nicht bzw. die Unit lässt sich nicht Aktivieren es kommt folgende Meldung:

Code: Alles auswählen

HomeKitServer systemd[1]: Started instanzen-reporter.
Feb 26 20:43:45 HomeKitServer systemd[1]: instanzen-reporter.service: Service hold-off time over, scheduling restart.
Feb 26 20:43:45 HomeKitServer systemd[1]: Stopped instanzen-reporter.
Feb 26 20:43:45 HomeKitServer systemd[1]: Started instanzen-reporter.
Feb 26 20:43:45 HomeKitServer systemd[1]: instanzen-reporter.service: Service hold-off time over, scheduling restart.
Feb 26 20:43:45 HomeKitServer systemd[1]: Stopped instanzen-reporter.
Feb 26 20:43:45 HomeKitServer systemd[1]: instanzen-reporter.service: Start request repeated too quickly.
Feb 26 20:43:45 HomeKitServer systemd[1]: Failed to start instanzen-reporter.
Feb 26 20:43:45 HomeKitServer systemd[1]: instanzen-reporter.service: Unit entered failed state.
Feb 26 20:43:45 HomeKitServer systemd[1]: instanzen-reporter.service: Failed with result 'start-limit-hit'.
        
Ich habe im Skript nur die Variablen ausgetausch gegen die echten Service Bezeichnung.

TomL

Re: Bash Skript für systemd Überwachung

Beitrag von TomL » 26.02.2018 23:21:37

Das muss als Hintergrund-Prozess laufen, weil systemd den Prozess nach 90 Sekunden Timeout bei fehlender Rückmeldung wieder killt. Das bedeutet, dass Script muss nach dem Start im Zeitraum von max 89 Sekunden mit dem Exit-Code 0 zurückkommen. Aber wie gesagt, ich halte diese Lösung nicht für die erste Wahl. Ich würde versuchen, das über systemd selber regeln zu lassen. Dann braucht man kein Script, keine Hintergrundverbeitung ... und wird vermutlich zuverlässiger als alles andere klappen.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Skript für systemd Überwachung

Beitrag von NAB » 26.02.2018 23:47:57

Wenn du da schon einen "Vorwurf" herauslesen willst, dann den, dass "passiert nix" keine hilfreiche Fehlerbeschreibung ist, und "habe es jetzt entfernt" ohne zu zeigen, was du überhaupt hinzugefügt hast, auch keine weitere Fehleranalyse erlaubt. Ein Hinweis, dass du keinen Schimmer hast, wie "dein" Script eigentlich funktioniert, wäre auch hilfreich gewesen.

Ich hab keine Ahnung, was "Apple SmartHome" überhaupt ist und hab keine Lust, ntfy zu installieren, darum kann ich es auch nicht 1:1 nachstellen.

Schau dir mal dieses Tutorial für xargs an:
https://shapeshed.com/unix-xargs/
genauer gesagt diese Stelle:
https://shapeshed.com/unix-xargs/#how-t ... e-executed
Mit der Option "-t" zeigt xargs dir an, was es überhaupt macht. Damit kriegst du raus, ob wirklich "nix passiert".
(Dazu musst du das Script natürlich auf der Konsole starten, nicht per Systemd)

Und diese Stelle:
https://shapeshed.com/unix-xargs/#how-t ... with-xargs
da kommt er auf die Option "-I" zu sprechen. Damit definierst du einen Platzhalter - er nimmt dort %, du nimmst #. Er ruft dann den Befehl "sh" (eine Shell) auf, du den Befehl "ntfy". Der Platzhalter zeigt weiter hinten an, wo die Eingabe, die xargs bekommt, eingesetzt werden soll.

In dem "passiert nix"-Beispiel hier:
https://limond.de/send-systemd-journal- ... gram-chat/
setzt er diese Eingabe per Platzhalter ganz ans Ende. Sie ist die eigentliche Nachricht, die ntfy sendet. Du machst das nicht - darum ist die ganze "-I"-Geschichte bei dir eigentlich völlig überflüssig. Und ich verstehe nicht, warum er "-I" überhaupt verwendet - eigentlich setzt xargs seine Eingabe eh ganz ans Ende.

Ich vermute, es hat damit zu tun, dass er die Ausgabe für ntfy zu einem String zusammenfügen muss. Siehe dieses Beispiel:

Code: Alles auswählen

$ echo 'one two three' | xargs -t ls -la
ls -la one two three 
ls: cannot access 'one': No such file or directory
ls: cannot access 'two': No such file or directory
ls: cannot access 'three': No such file or directory
$ echo 'one two three' | xargs -t -I '#' ls -la '#'
ls -la one two three 
ls: cannot access 'one two three': No such file or directory
Die ausgeführte Zeile "ls -la one two three" sieht beide male gleich aus, aber beim zweiten mal wird nur ein String übergeben statt drei.

Was ich auch nicht verstehe ist, warum er ausgerechnet das Kommentarzeichen # als Platzhalter nimmt. Das zwingt ihn nämlich zu den Anführungsstrichen. Mit einem anderen Platzhalter wäre es einfacher:

Code: Alles auswählen

$ echo 'one two three' | xargs -t -I # ls -la #
xargs: option requires an argument -- 'I'
Try 'xargs --help' for more information.
$ echo 'one two three' | xargs -t -I % ls -la %
ls -la one two three 
ls: cannot access 'one two three': No such file or directory
Beim ersten Versuch mit # sieht er alles nach dem # als Kommentar an. Für xargs hört die Zeile also nach -I auf und es beschwert sich. Mit % funktioniert's.

Und jetzt mal auf dein Problem übertragen:

Code: Alles auswählen

$ echo one two three | xargs -t -I % ntfy -b telegram send 'Homebridge Instanz % ausgefallen'
ntfy -b telegram send Homebridge Instanz one two three ausgefallen 
xargs: ntfy: No such file or directory
Und da passiert "nix"?

Fraglich ist, ob auch das hier funktioniert - da hab ich das -I weggelassen:

Code: Alles auswählen

$ echo one two three | xargs -t ntfy -b telegram send 'Homebridge Instanz ausgefallen:'
ntfy -b telegram send Homebridge Instanz ausgefallen: one two three 
xargs: ntfy: No such file or directory
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 27.02.2018 05:26:05

Hey,
vielen Dank für die ausführlichen Antworten. Habe ich irgendwie nicht mit gerechnet @NAB bin schon etwas erschlagen :THX: . Aber ich freu mich :D

Ich habe mir die Sachen die du verlinkt hast zu xarg durchgelesen, will aber nicht behaupten das ich alles verstanden habe. Probiert habe ich aber so gut wie möglich bzw. soweit ich die Punkte verstehe es zu testen.

Also nochmal von vorne:
Ich verstehe nicht, was das -I '#' da macht. Das # wird danach doch gar nicht mehr benutzt. Was passiert denn, wenn du das # einfach in den zu sendenden String einfügst?
Hier habe ich die Raute in den zu sendenen String eingefügt.

Skript sieht so aus:

Code: Alles auswählen

#!/bin/bash 
journalctl --unit homebridge* -f --since "now" | 
grep --line-buffered "exited" | 
sudo -u pi xargs -L1 -I ntfy -b telegram send '#Homebridge Instanz ausgefallen’
Ergebnis:
pi@HomeKitServer:/usr/local/bin $ sudo systemctl restart instanzen-reporter.service
pi@HomeKitServer:/usr/local/bin $ sudo journalctl -f -au instanzen-reporter
-- Logs begin at Mon 2018-02-26 12:34:12 CET. --
Feb 27 03:38:14 HomeKitServer systemd[1]: Started instanzen-reporter.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Main process exited, code=exited, status=203/EXEC
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Unit entered failed state.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Failed with result 'exit-code'.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Service hold-off time over, scheduling restart.
Feb 27 03:38:14 HomeKitServer systemd[1]: Stopped instanzen-reporter.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Start request repeated too quickly.
Feb 27 03:38:14 HomeKitServer systemd[1]: Failed to start instanzen-reporter.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Unit entered failed state.
Feb 27 03:38:14 HomeKitServer systemd[1]: instanzen-reporter.service: Failed with result 'exit-code'.
Mit der Option "-t" zeigt xargs dir an, was es überhaupt macht. Damit kriegst du raus, ob wirklich "nix passiert".
(Dazu musst du das Script natürlich auf der Konsole starten, nicht per Systemd)
Wenn ich das -I gegen das -t austausche und mit sudo bash das Skript im Terminal starte (bin im Verzeichnis an dem das Skript liegt ) kommt keine Ausgabe die neue Zeile bleibt Leer. Das gleiche passiert aber auch wenn ich das Skript in der Ursprungsform manuell ausführe. Ich habe eine Instanz vorher gestoppt das auch ein Fehler vorhanden ist den er berücksichtigen kann. sudo bash instanzen-reporter.sh sollte doch richtig sein um es manuell auszuführen?
Was ich auch nicht verstehe ist, warum er ausgerechnet das Kommentarzeichen # als Platzhalter nimmt. Das zwingt ihn nämlich zu den Anführungsstrichen. Mit einem anderen Platzhalter wäre es einfacher:
Das habe ich jetzt ausprobiert und die # sowie das -I gegen -t ausgetauscht im ursprünglichen Skript, jetzt lässt der Instanzen-reporter.service Starten aber bekommt folgende Fehler Meldung

Code: Alles auswählen

ç#!/bin/bash 
journalctl --unit homebridge* -f --since "now" | 
grep --line-buffered "exited" | 
sudo -u pi xargs -L1 -t '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'

Code: Alles auswählen

pi@HomeKitServer:/usr/local/bin $ sudo journalctl -f -au instanzen-reporter
-- Logs begin at Mon 2018-02-26 12:34:12 CET. --
Feb 27 04:13:43 HomeKitServer sudo[27500]:     root : TTY=unknown ; PWD=/ ; USER=pi ; COMMAND=/usr/bin/xargs -L1 -I $ ntfy -b telegram send Homebridge Instanz ausgefallen $
Feb 27 04:13:43 HomeKitServer sudo[27500]: pam_unix(sudo:session): session opened for user pi by (uid=0)
Feb 27 04:14:38 HomeKitServer systemd[1]: Stopping instanzen-reporter...
Feb 27 04:14:38 HomeKitServer sudo[27500]: pam_unix(sudo:session): session closed for user pi
Feb 27 04:14:38 HomeKitServer systemd[1]: Stopped instanzen-reporter.
Feb 27 04:14:53 HomeKitServer systemd[1]: Started instanzen-reporter.
Feb 27 04:14:53 HomeKitServer sudo[28320]:     root : TTY=unknown ; PWD=/ ; USER=pi ; COMMAND=/usr/bin/xargs -L1 -t $ ntfy -b telegram send Homebridge Instanz ausgefallen $
Feb 27 04:14:53 HomeKitServer sudo[28320]: pam_unix(sudo:session): session opened for user pi by (uid=0)
Feb 27 04:15:58 HomeKitServer instanzen-reporter.service[28317]: $ ntfy -b telegram send Homebridge Instanz ausgefallen $ Feb 27 04:15:57 HomeKitServer systemd[1]: homebridge-test.service: Main process exited, code=exited, status=143/n/a
Feb 27 04:15:58 HomeKitServer instanzen-reporter.service[28317]: xargs: $: Datei oder Verzeichnis nicht gefunden
Und jetzt mal auf dein Problem übertragen:
CODE: ALLES AUSWÄHLEN
$ echo one two three | xargs -t -I % ntfy -b telegram send 'Homebridge Instanz % ausgefallen'
ntfy -b telegram send Homebridge Instanz one two three ausgefallen
xargs: ntfy: No such file or directory
Und da passiert "nix"?

Fraglich ist, ob auch das hier funktioniert - da hab ich das -I weggelassen:
CODE: ALLES AUSWÄHLEN
$ echo one two three | xargs -t ntfy -b telegram send 'Homebridge Instanz ausgefallen:'
ntfy -b telegram send Homebridge Instanz ausgefallen: one two three
xargs: ntfy: No such file or directory
Hier muss ich leider passen sorry, wie und wo muss ich was einfügen im Skript. Habe deine Nachricht jetzt bestimmt 20 mal gelesen aber irgendwie geht da die Lampe nicht an bei mir. Entfällt die letzte Zeile im originalen Skript und wird gegen die echo Zeile ausgetauscht und die Variablen angepasst?

Bin jetzt etwas verwirrt und blicke nicht mehr ganz durch :|

Das muss als Hintergrund-Prozess laufen, weil systemd den Prozess nach 90 Sekunden Timeout bei fehlender Rückmeldung wieder killt. Das bedeutet, dass Script muss nach dem Start im Zeitraum von max 89 Sekunden mit dem Exit-Code 0 zurückkommen.
@TomL Wie müsste ich da vorgehen das es nach max 89 Sekunden mit dem Exit-Code 0 zurückkommt und als Hintergrundprozess läuft?
Aber wie gesagt, ich halte diese Lösung nicht für die erste Wahl. Ich würde versuchen, das über systemd selber regeln zu lassen. Dann braucht man kein Script, keine Hintergrundverbeitung ... und wird vermutlich zuverlässiger als alles andere klappen.
@TomL Da hatte ich dich weiter oben nach gefragt. Ich habe dich so verstanden das mit onFailure in der Unit die Nachricht direkt über ntfy versendet wird? Vielleicht kannst du es kurz an einem Beispiel erläutern wie die Unit angepasst werden muss damit die Push Nachricht direkt verschickt wird.


So sieht eine Unit von einem Service der Überwacht werden soll aktuell aus:

Code: Alles auswählen

[Unit]
Description=Node.js HomeKit Server 
After=syslog.target network-online.target

[Service]
Type=simple
User=root
EnvironmentFile=/etc/default/homebridge-test
ExecStart=/usr/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process
ExecStartPre= 

[Install]
WantedBy=multi-user.target

@NAB Noch eine Frage zum Schluss das Skript weiter oben von @breakthewall das wäre nach deiner Meinung nicht der richtige Weg da ich irgendwie keine parallelen zu deine aufgezeigten Möglichkeiten sehe?

Also nochmal vielen Dank an alle für die Mühe und Geduld!

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Skript für systemd Überwachung

Beitrag von NAB » 27.02.2018 16:26:36

Na holla ... Nastra legt los :mrgreen:
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Ich habe mir die Sachen die du verlinkt hast zu xarg durchgelesen, will aber nicht behaupten das ich alles verstanden habe. Probiert habe ich aber so gut wie möglich bzw. soweit ich die Punkte verstehe es zu testen.
Du, das Wichtigste ist, dass du lernst, mit deinem Script bzw. mit einzelnen Zeilen daraus auf der Kommandozeile zu spielen und Trockenübungen zu machen ... das hat nicht so richtig geklappt ...
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Ich verstehe nicht, was das -I '#' da macht. Das # wird danach doch gar nicht mehr benutzt. Was passiert denn, wenn du das # einfach in den zu sendenden String einfügst?
Skript sieht so aus:

Code: Alles auswählen

sudo -u pi xargs -L1 -I ntfy -b telegram send '#Homebridge Instanz ausgefallen’
Also was hast du hier gemacht? Hmm ... das -I bezeichnet immer noch einen Platzhalter. Du hast den Platzhalter '#' aber rausgenommen. Und der Platzhalter ist: '#'. Nicht: #. Weiterhin hinten hast du aber ein # eingefügt. Mal ausprobieren, was xargs dazu sagt:

Code: Alles auswählen

$ echo one two three | xargs -L1 -I ntfy -b telegram send '#Homebridge Instanz ausgefallen’
> 
Uh? Mist. Was ist denn nun los? Der wird ja gar nicht fertig. Er wartet auf ne zweite Eingabe. Wieso das denn?

Ah ... wenn du mal genau hinguckst ... du mischt zwei verschiedene Anführungszeichen. Die gerade nach oben und die nach schräg rechts oben. Also wenn du so unsauber arbeitest, machst du dir das Leben unnötig schwer. Er wartet dann einfach darauf, dass du den String (also die Zeichenkette) mit dem richtigen Anführungszeichen beendest.

Und selbst wenn du das korrigierst ... hinter dem -I steht jetzt "ntfy". Du definierst jetzt also "ntfy" als Platzhalter. Dahinter findet xargs noch eine Option -b, die es nicht kennt und wird sich vermutlich beschweren. Danach wird es versuchen, den Befehl "telegram" auszuführen, den es vermutlich nicht gibt.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Wenn ich das -I gegen das -t austausche
Moooooment! Von "Austauschen" habe ich nichts gesagt. Das -I braucht grundsätzlich noch einen Platzhalter dahinter, damit es funktioniert. Sonst schmeißt es einen Fehler. Das -t versteht sich zusätzlich.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
und mit sudo bash das Skript im Terminal starte (bin im Verzeichnis an dem das Skript liegt ) kommt keine Ausgabe die neue Zeile bleibt Leer.
Wenn du da weiterhin dein Anführungszeichen-Problem drin hast, ist das auch logisch.
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Das gleiche passiert aber auch wenn ich das Skript in der Ursprungsform manuell ausführe.
Solange du ihm nicht mit einem zusätzlichen -t sagst, dass er etwas ausgeben soll, ist das auch logisch. (Dass überhaupt ein Ereignis eintreten muss, auf das dein Script reagiert, also der "exit" einer homebridge-Instanz, ist klar, ja?)
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05

Code: Alles auswählen

ç#!/bin/bash 
[...]
sudo -u pi xargs -L1 -t '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
(ich hoffe, das "c" am Anfang ist nur ein Kopierfehler)
Nun bin ich mal gespannt, was passiert:

Code: Alles auswählen

$ echo one two three | xargs -L1 -t '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
$ ntfy -b telegram send Homebridge Instanz ausgefallen $ one two three 
xargs: $: No such file or directory
xargs möchte jetzt also den Befehl "$ ntfy -b telegram send Homebridge Instanz ausgefallen $ one two three" ausführen. Warum? Du hast das -I weggelassen. Für xargs hören die Optionen nach dem -t auf, danach fängt der Befehl an, den es ausführen soll. Und das ist der Befehl '$'. Und den findet es nicht. Deswegen beendet es sich (und instanzen-reporter) mit einem Fehler. Logisch.

Und wenn ich das -I wieder reinnehme?

Code: Alles auswählen

$ echo one two three | xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
ntfy -b telegram send Homebridge Instanz ausgefallen one two three 
xargs: ntfy: No such file or directory
Sieht doch ganz gut aus, oder?
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Entfällt die letzte Zeile im originalen Skript und wird gegen die echo Zeile ausgetauscht und die Variablen angepasst?
Nein! Das dämliche echo hab ich da nur reingesetzt, damit ich nicht dauernd systemd-Dienste stoppen und starten muss. Ich hab ja dieses Homebridge-Gedöns nicht. Das echo ersetzt mir die ersten zwei Script-Zeilen (also nur mir, nicht dir!). Für dich ist erst mal nur interessant, was hinter dem xargs passiert, damit du unterschiedliche Nachrichten je nach ausgefallenem Dienst bekommst.

Du kannst aber selber Trockenübungen ausführen, indem du echo eine Zeile ausgeben lässt, die journalctl dir sonst ausgibt, also so:

Code: Alles auswählen

echo "Feb 27 04:15:58 HomeKitServer instanzen-reporter.service[28317]: $ ntfy -b telegram send Homebridge Instanz ausgefallen $ Feb 27 04:15:57 HomeKitServer systemd[1]: homebridge-test.service: Main process exited, code=exited, status=143/n/a" | sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
Noch eine Frage zum Schluss das Skript weiter oben von @breakthewall das wäre nach deiner Meinung nicht der richtige Weg da ich irgendwie keine parallelen zu deine aufgezeigten Möglichkeiten sehe?
Das Script von breakthewall macht genau das gleiche wie dein Script, nur mehr in die Länge gezogen. Und es hat das gleiche xargs-Problem wie dein Script. Ich mag an deiner Variante, dass es kurz und knackig ist, aber das ist Geschmackssache. Wie auch immer ... du wirst bei beiden Scripten besser verstehen müssen, wie sie funktionieren, um sie nach deinen Wünschen anzupassen.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

TomL

Re: Bash Skript für systemd Überwachung

Beitrag von TomL » 27.02.2018 18:16:20

Nastra hat geschrieben: ↑ zum Beitrag ↑
27.02.2018 05:26:05
@TomL Wie müsste ich da vorgehen das es nach max 89 Sekunden mit dem Exit-Code 0 zurückkommt und als Hintergrundprozess läuft?
Es geht nicht um "nach 89 Sekunden zurückzukehren" ... mit richtigem Design kehrt ein solch einfacher Prozess spätestens ne halbe Sekunde nach dem Start zurück, hat einen Daemon geforkt und beendet sich selber. Hier liegt meiner Meinung nach ein grundsätzlicher Designfehler vor. Sorry... aber die einfachste Lösung wäre, den Quatsch einfach zu löschen und nicht mehr damit weiterzumachen.... :wink:

Wie ich ganz zu Anfang schon sagte, die von mir angegebenen Man-Pages beschreiben wie es geht... man muss das allerdings lesen, testen und selber damit üben. Meine ganz ehrliche und unverblümte Meinung dazu ist: Wenn Du hier nur malen nach Zahlen betreiben möchtest, solltest Du besser keine häuslichen Dienste einrichten, die Du über eine Smartphone-App via Mobile Daten bedienen willst. Das ist meiner Meinung nach einfach nur hochgradig fahrlässig. Aber egal, letztlich ist das ist nicht mein Problem... hier folgt trotzdem die Lösung:

Ich habe hier aus Spass an der Frage mal einen kleinen Daemon geschrieben, der geplant nach 100 Sekunden Laufzeit "stirbt"

Code: Alles auswählen

#!/bin/bash

Daemon()
{
   for ((n=0;n<100;n++))
   do
        sleep 1
   done
   
   exit 1
}

Daemon &
exit 0
Der wird gestartet mit dieser Unit und restartet bei failure.... und er "benachrichtigt" bei Absturz via 2. Unit

Code: Alles auswählen

[Unit]
Description=Test Sterbender Daemon 
OnFailure=daemon@test_daemon.service

[Service]
Type=forking
ExecStart=/bin/bash -c '/test/daemon'
Restart=on-failure

[Install]
WantedBy=multi-user.target
Bei einem Problem, also wenn der Daemon stirbt, wird eine instantiierte zweite Unit mit dem Instanz-Namen "test_daemon" aufgerufen.... ich habe hier einfach den Speicherort und den Namen des (gestorbenen/betroffenen) Programms genommen also "test_daemon" für "/test/daemon". Dieser Unit habe ich den Titel "Ausrufer" gegeben, weil sie nur mitteilt, dass der Kandidat gestorben ist. Das kann natürlich auch ein aufgerufenes weiteres Script sein.

Instantiierte Units sind hier ausreichend gut beschrieben... be Fragen dazu, hier fragen... :-)
https://stackoverflow.com/questions/397 ... f-the-same

Code: Alles auswählen

[Unit]
Description=Sterbender Daemon - Ausrufer

[Service]
Type=oneshot
RemainAfterExit=no

ExecStart=/bin/bash -c "/bin/echo '%I ist gestorben' | systemd-cat -t 'Daemonmessenger' -p 'info'"

[Install]
WantedBy=multi-user.target
Im Log ist das angekommen:

Der Job wird gestartet:
Feb 27 17:48:29 thomaspc systemd[1]: Starting Test sterbender daemon...
Feb 27 17:48:29 thomaspc systemd[1]: Started Test sterbender daemon.

Exakt nach den 100 Sekunden stirbt er:
Feb 27 17:50:09 thomaspc systemd[1]: daemon.service: Main process exited, code=exited, status=1/FAILURE
Feb 27 17:50:09 thomaspc systemd[1]: daemon.service: Unit entered failed state.
Feb 27 17:50:09 thomaspc systemd[1]: daemon.service: Triggering OnFailure= dependencies.
Feb 27 17:50:09 thomaspc systemd[1]: daemon.service: Failed with result 'exit-code'.
Feb 27 17:50:09 thomaspc systemd[1]: Created slice system-daemon.slice.

Der "Ausrufer" ist aktiv
Feb 27 17:50:09 thomaspc systemd[1]: Starting Sterbender Daemon - Ausrufer...
Feb 27 17:50:09 thomaspc Daemonmessenger[6544]: test_daemon ist gestorben
Feb 27 17:50:09 thomaspc systemd[1]: Started Sterbender Daemon - Ausrufer.

Der Job wird restartet:
Feb 27 17:50:10 thomaspc systemd[1]: daemon.service: Service hold-off time over, scheduling restart.
Feb 27 17:50:10 thomaspc systemd[1]: Stopped Test sterbender daemon.
Feb 27 17:50:10 thomaspc systemd[1]: Starting Test sterbender daemon...
Feb 27 17:50:10 thomaspc systemd[1]: Started Test sterbender daemon.

So... viel Spass damit.... :wink:

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Bash Skript für systemd Überwachung

Beitrag von Nastra » 28.02.2018 06:43:39

Guten Morgen,
Na holla ... Nastra legt los :mrgreen:
da kannst du einen drauf lassen, auch wenn mir der Kopf schon qualmt. Ist immer wieder witzig zu Erfahren wie schnell man in bestimmten Bereichen an seine Grenzen stößt was für euch hier scheinbar tägliches Brot ist.
Wie auch immer ... du wirst bei beiden Scripten besser verstehen müssen, wie sie funktionieren, um sie nach deinen Wünschen anzupassen.
Da hast du Recht, das ding ist ich muss mir erstmal mehr Basis Wissen über Shell Skripte aneignen, scheinbar ist es doch komplexer als gedacht nach dem ihr mich hier relativ schnell an meine Grenzen gebracht habt :wink:
Aber ich gebe mir große mühe mit :google: und denke das ich es mit eurer Hilfe noch hinbekomme.

@NAB Hier ist der aktuelle Zwischenstand,

Wenn ich die Zeile so in das Skript aufnehme wie du Sie mir hier Modelliert hast funktioniert alles wie ursprünglich, damit sollte das xarg Problem was du angesprochen hast und mir bis dahin nicht bewusst gewesen ist erledigt sein oder liege ich da falsch?

Code: Alles auswählen

#!/bin/bash 
journalctl --unit home bridge* -f --since "now" | 
grep --line-buffered "exited" | 
sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
Jetzt frage ich mich natürlich wie es weiter geht. Ziel meines Anliegen war ja das ich die Homebridge Instanzen mit einem Service und einem Shell Skript überwachen kann um verschiedene Benachrichtigung mit entsprechenden Instanzennamen zu erhalten bei Ausfall.

Ich habe nochmal probiert das Skript von @breakthewall zum laufen zu bekommen da es ja eigentlich genau das Abbildet was ich mir vorstelle.

Da ich beim Aktivieren des Service diesen Fehler

Code: Alles auswählen

HomeKitServer systemd[1]: instanzen-reporter.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
erhielt, habe ich das Skript bei https://www.shellcheck.net geprüft und gemäß der Fehler die er mir angezeigt hat angepasst bis die Meldung No Issuse ausgegeben wurde.

Im Detail hat bemängelt das Servicecheck kleingeschrieben und kein $ Zeichen davor gesetzt war.
Außerdem habe ich unsere angepasste xarg Zeile in das Skript übernommen. Ich hoffe mein vorgehen war an dieser Stelle richtig :?:

Das Skript sieht aktuell so aus:

Code: Alles auswählen

#!/bin/bash

message1="Homebridge 1 Instanz ausgefallen"
message2="Homebridge 2 Instanz ausgefallen"

send-message() {
xargs -L1 -t -I '$' ntfy -b telegram send '$'
}

SERVICECHECK() {
journalctl -f --since "now" | 
grep -E "exited" | grep -E "homebridge-test|homebridge-hue"
}

if [[ $SERVICECHECK =~ "homebridge-test" ]]
  then
      send-message "$message1"
elif [[ $SERVICECHECK =~ "homebridge-hue" ]]
    then
        send-message "$message2"
fi



Jetzt habe ich probiert den Instanzen-reporter.service mit dem Skript zu Aktivieren. Leider erhalte ich beim Aktivieren wieder diesen Fehler wie oben schon mal aufgezeigt:

Code: Alles auswählen

pi@HomeKitServer:~ $ sudo systemctl status instanzen-reporter.service
● instanzen-reporter.service - instanzen-reporter
   Loaded: loaded (/etc/systemd/system/instanzen-reporter.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Wed 2018-02-28 05:55:03 CET; 440ms ago
  Process: 16497 ExecStart=/usr/local/bin/instanzen-reporter.sh (code=exited, status=0/SUCCESS)
 Main PID: 16497 (code=exited, status=0/SUCCESS)

Feb 28 05:55:03 HomeKitServer systemd[1]: instanzen-reporter.service: Service hold-off time over, scheduling restart.
Feb 28 05:55:03 HomeKitServer systemd[1]: Stopped instanzen-reporter.
Feb 28 05:55:03 HomeKitServer systemd[1]: instanzen-reporter.service: Start request repeated too quickly.
Feb 28 05:55:03 HomeKitServer systemd[1]: Failed to start instanzen-reporter.
Feb 28 05:55:03 HomeKitServer systemd[1]: instanzen-reporter.service: Unit entered failed state.
Feb 28 05:55:03 HomeKitServer systemd[1]: instanzen-reporter.servic
darauf hin habe ich :google: bemüht und bin auf diese Lösungsmöglichkeiten gestoßen: https://www.hiroom2.com/2017/02/18/linu ... ervice/und habe es getestet aber leider ohne Erfolg.

Jetzt die große Frage, ist mein vorgehen bis hier hin soweit noch in Ordnung oder bin ich wieder auf dem Holzweg?
Wenn alles in Ordnung ist wie bekomm ich das mit der Service Aktivierung in den Griff @TomL hatte oben geschrieben das muss als Hintergrundprozess ablaufen. Kann ich aber auch nicht wirklich was mit anfangen. Es sollte doch eigentlich möglich sein das Skript von @breakthewall genau so zu aktivieren wie es mit dem original Skript funktioniert?

@TomL Cool das du deinen Lösungsweg so detaillierter aufgezeigt hast, ich denke aber das für mich die aktuelle Möglichkeit die ich verfolge ausreichend und anspruchsvoll genug ist, auch wenn es vermutlich nicht die saubererste Lösung ist. Ich werde es aber im Hinterkopf behalten und ggf. mal ausprobieren in einer ruhigen Minute :wink:

An dieser Stelle nochmal vielen Dank euch allen für die Hilfe!

TomL

Re: Bash Skript für systemd Überwachung

Beitrag von TomL » 28.02.2018 10:46:41

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 06:43:39
Jetzt die große Frage, ist mein vorgehen bis hier hin soweit noch in Ordnung oder bin ich wieder auf dem Holzweg?
1: Nein! 2: Ja!
Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 06:43:39
...ich denke aber das für mich die aktuelle Möglichkeit die ich verfolge ausreichend und anspruchsvoll genug ist,...
Nööö, ist sie nicht... es entspricht in etwa dem Vorhaben, 4 Pferde mit extra entwickelter Geschirr-Technik vor einem VW Golf anzuspannen, nur weil man den Ratschlag zur Verwendung des normalen Schlüssels und dessen Bedienung nicht versteht. Und spannend wirds dann, wenn das Fuhrwerk trotzdem nicht fährt, weil noch die Handbremse angezogen ist (nach dem Timeout gekillt) und wenn man dann zur Fehlerbehebungn den Golf auf nen Hänger zieht...*lol*... aber was solls... ist ja Linux... da geht alles, sogar unsinniges.... und wenns funktioniert... na, denn man tau :twisted:

s.c.n.r.

Für eine sinnvolle Lösung ist überhaupt kein Script notwendig... es wird in der Unit (Beispiel Ausrufer s.o.) lediglich nur diese eine Zeile gebraucht... in Abhängigkeit von der lokalen Telegram-Konfiguration:

Code: Alles auswählen

ExecStart=/opt/telegram/telegram-cli -k tg-server.pub -W -e "msg TomL Prozess %I ist gestorben und wiederbelebt." 

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash Skript für systemd Überwachung

Beitrag von NAB » 28.02.2018 14:00:48

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 06:43:39
Wenn ich die Zeile so in das Skript aufnehme wie du Sie mir hier Modelliert hast funktioniert alles wie ursprünglich, damit sollte das xarg Problem was du angesprochen hast und mir bis dahin nicht bewusst gewesen ist erledigt sein oder liege ich da falsch?
Ja, da liegst du falsch. Es soll ja eben nicht wie vorher funktionieren, sondern dir zusätzlich mitteilen, welche Instanz ausgefallen ist. Du wolltest doch individuelle Benachrichtigungen und nicht immer die gleiche.
Das klappt mit:
ntfy -b telegram send 'Homebridge Instanz ausgefallen' '$'
anscheinend nicht. ntfy ignoriert das '$'. ntfy hat mit 'Homebridge Instanz ausgefallen' seine Nachricht, die es schicken soll und hat damit genug und guckt nicht mehr, was noch dahinter steht. Das haben wir jetzt ausprobiert. Gut, dann muss das '$' in die Nachricht hinein. Das ist ziemlich einfach, dazu muss nur das Leerzeichen zwischen 'Homebridge Instanz ausgefallen' und '$' weg. Dann hält er es für eine Zeichenkette:

Code: Alles auswählen

sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen''$'
Probiere das mal aus. Telegram müsste dir jetzt die gesamte Zeile senden, die journalctl ausgespuckt hat.
Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 06:43:39

Code: Alles auswählen

pi@HomeKitServer:~ $ sudo systemctl status instanzen-reporter.service
● instanzen-reporter.service - instanzen-reporter
   Loaded: loaded (/etc/systemd/system/instanzen-reporter.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since Wed 2018-02-28 05:55:03 CET; 440ms ago
  Process: 16497 ExecStart=/usr/local/bin/instanzen-reporter.sh (code=exited, status=0/SUCCESS)
 Main PID: 16497 (code=exited, status=0/SUCCESS)
Hmm ... "dein" Script lauscht ja permanent an den Ausgabe von journalctl. Wenn ich mir das Script von breakthewall genau angucke ... das tut eben das nicht. Das fragt einmalig kurz journalctl ab und beendet sich dann. Steht ja auch da ... "erfolgreich beendet". Wie er sich das nun gedacht hat, weiß ich auch nicht ...
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 28.02.2018 15:56:56

@TomL Alles klar, gute Erklärung :mrgreen: eine Frage hätte ich noch zu der Lösung von dir. Ich bräuchte für jede Instanz bzw. Service den ich Überwachen möchte auch einen eigenen Daemon gem. deiner Anleitung oder? Wenn ja wäre die Lösung ggf. bei einer Verwendung auf dem Pi relativ Ressourcen hungrig wenn man mehrere Service überwachen möchte?
Hintergrund der Frage ist das ich die Erfahrung gemacht habe das beim Pi auch wenn ich selber "keinen" aktuell nutze aber irgendwann möglicherweise wieder bei ca. 16 - 17 Homebridge Instanzen /Service vom Arbeitsspeicher Schluss ist, da dieser dann zu klein wird mit 1 GB.
Probiere das mal aus. Telegram müsste dir jetzt die gesamte Zeile senden, die journalctl ausgespuckt hat.
@NAB Mit oder ohne Leerzeichen beim $ macht keinen Unterschied, er beachtet diese scheinbar überhaupt nicht da die Nachricht immer die Gleiche ist 'Homebridge Instanz ausgefallen'
Hmm ... "dein" Script lauscht ja permanent an den Ausgabe von journalctl. Wenn ich mir das Script von breakthewall genau angucke ... das tut eben das nicht. Das fragt einmalig kurz journalctl ab und beendet sich dann. Steht ja auch da ... "erfolgreich beendet". Wie er sich das nun gedacht hat, weiß ich auch nicht ...
Schade das @breakthewall sich nicht mehr gemeldet hat, hast du ggf. oder jemand anderes eventuell die Fähigkeit das Skript so anzupassen das es auch ständig lauscht und nicht direkt abschaltet nach dem es durchgelaufen ist. Da wird vermutlich auch der Fehler beim Aktivieren herstammen?

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 28.02.2018 16:01:30

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 15:56:56
@TomL Alles klar, gute Erklärung :mrgreen: eine Frage hätte ich noch zu der Lösung von dir. Ich bräuchte für jede Instanz bzw. Service den ich Überwachen möchte auch einen eigenen Daemon gem. deiner Anleitung oder? Wenn ja wäre die Lösung ggf. bei einer Verwendung auf dem Pi relativ Ressourcen hungrig wenn man mehrere Service überwachen möchte?
Nein, braucht man nicht... das, was ich dir gepostet habe, ist alles, was man braucht. Bei Deinem Modell braucht es diesen unnützen Overhead eines überflüssigen Daemons mit der noch überflüssigeren Überwachung des Journals, bei meinem nicht. Bei meinem Vorschlag ist es das genaue Gegenteil, das verbraucht praktisch überhaupt keine Ressourcen. In den bestehenden bzw. zu überwachenden Services wird nur die neue Abhängigkeit eingetragen... und eine einzige neue (instantiated) Unit zum Senden der Nachricht eingerichtet. Der Aufwand geht gegen Null, man nutzt einfach das, was systemd von hause aus kann.

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 28.02.2018 16:10:44

Das hört sich gut an, :THX: ich probiere es jetzt einfach mal aus.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Skript für systemd Überwachung

Beitrag von NAB » 28.02.2018 16:41:50

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 15:56:56
@NAB Mit oder ohne Leerzeichen beim $ macht keinen Unterschied, er beachtet diese scheinbar überhaupt nicht da die Nachricht immer die Gleiche ist 'Homebridge Instanz ausgefallen'
Auch wenn du das Script per Hand auf der Konsole startest? Du hast ja das -t noch drin, das Script müsste dir also erzählen, welche Nachrichten es per ntfy versendet. Irgendwo muss das '$' ja abgeblieben sein.
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 28.02.2018 16:50:05

So schaut es aus:

Code: Alles auswählen

pi@HomeKitServer:~ $ echo xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen''$'
xargs -L1 -t -I $ ntfy -b telegram send Homebridge Instanz ausgefallen$

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Shell Skript für systemd Überwachung

Beitrag von NAB » 28.02.2018 17:12:38

Nastra hat geschrieben: ↑ zum Beitrag ↑
28.02.2018 16:50:05
So schaut es aus:
Nein, nein. Ich meinte, dass du das gesamte Script per sudo startest, nicht nur die eine Zeile.

Eine Trockenübung auf der Konsole kannst du natürlich auch machen. Das sähe dann so aus:

Code: Alles auswählen

pi@HomeKitServer:~ $ echo "Testzeile" | xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen''$'
Hast du eigentlich eine Ahnung, wozu die senkrechten Striche in deinem Script gut sind?
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

Nastra
Beiträge: 94
Registriert: 13.02.2018 05:12:27

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 01.03.2018 05:56:58

Moin moin,

@NAB es gibt gute Nachrichten :D

Ich habe die xarg Zeile gerade getestet, irgendwie ohne große Hoffnung als Trockenübung so wie du es beschrieben hast. Zwei Terminal Fenster auf in einem sudo bash Instanzen-reporter.sh und im anderen die Homebridge gestoppt.
Habe mich richtig erschrocken wo ich einen ausschnitt vom journal erhalten habe :THX: :THX: :THX:

Es funktioniert jetzt :hail: :mrgreen: :hail:

Code: Alles auswählen

pi@HomeKitServer:~ $ echo "Testzeile" | xargs -L1 -t -I '$' ntfy -b telegram send 'Homebridge Instanz ausgefallen''$'
Die Lösung von @TomL habe ich auf Grund kurzfristiger Planänderung meiner Frau gestern leider nicht mehr geschafft zu testen. Werde ich aber wie gesagt demnächst mir in einer ruhigen Minute nochmal genauer anschauen.
Hast du eigentlich eine Ahnung, wozu die senkrechten Striche in deinem Script gut sind?
Trennt die für die Übereinstimmung verfügbaren Alternativen :wink:

@NAB @TomL Vielen vielen Dank euch beiden für die Klasse Unterstützung!

Antworten