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

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
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 » 01.03.2018 13:15:39

Nanü? War's das schon? Ich dachte, du wolltest auch noch mehrere Dienste überwachen?

Und warum ging's denn beim ersten Versuch nicht?

Wie auch immer ... wenn du meinst, fertig zu sein, nimm das -t wieder raus.
Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 05:56:58
Hast du eigentlich eine Ahnung, wozu die senkrechten Striche in deinem Script gut sind?
Trennt die für die Übereinstimmung verfügbaren Alternativen :wink:
Nein, im Gegenteil. Der senkrechte Strich schweißt die einzelnen Befehle zusammen. Es stopft die Ausgabe des ersten Befehls in den nächsten. Das grobe Schema deines Scriptes ist: journalctl | grep | xargs
Das ist eigentlich recht übersichtlich :D
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: Gelöst! Shell Skript für systemd Überwachung

Beitrag von Nastra » 01.03.2018 14:19:20

Und warum ging's denn beim ersten Versuch nicht?
Wenn ich das mal wüsste :cry:

Nanü? War's das schon? Ich dachte, du wolltest auch noch mehrere Dienste überwachen?
Du hast Recht, vom Grundsatz kann ich garnicht mehrere Dienste mit dieser Variante Überwachen. Bei den Homebridge Instanzen funktioniert es glücklicherweise da diese alle den gleichen Namen haben

Code: Alles auswählen

homebridge-xxx
und den gleichen Fehler auswerfen beim Abbruch.

Die Telegram Ausgabe sieht so aus je nach Instanz die beendet wurde:

Code: Alles auswählen

Achtung - Mär 01 13:33:10 HomeKitServer systemd[1]: homebridge-test.service: Main process exited, code=exited, status=143/n/a

Code: Alles auswählen

Achtung - Mär 01 08:54:53 HomeKitServer systemd[1]: homebridge-soundtouch.service: Main process exited, code=exited, status=143/n/a
Für die Überwachung von Backups und ähnlichen Funktionen kann ich das Skript so auch nutzen um mich benachrichtigen zu lassen, muss hier aber für jeden Service einen reporter-service anlegen.

Also richtig fertig eigentlich noch nicht, aber schon eine ganze Ecke weiter das ich damit leben könnte :D

Also wenn du noch Lust hast mir weiter zu helfen und du denkst das wir es hinbekommen mit einen Skript mehrere Dienste zu Überwachen bin ich auf jeden Fall dabei! Du musst mir nur sagen wie es weiter geht nach diesem Meilenstein :mrgreen: :?:

Gruß Nastra

TomL

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

Beitrag von TomL » 01.03.2018 15:37:14

Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 14:19:20
Du hast Recht, vom Grundsatz kann ich garnicht mehrere Dienste mit dieser Variante Überwachen.
:::
Für die Überwachung von Backups und ähnlichen Funktionen kann ich das Skript so auch nutzen um mich benachrichtigen zu lassen, muss hier aber für jeden Service einen reporter-service anlegen.
Sorry, wenn ich mich hier noch mal reinhänge... aber manchmal frage ich mich echt, wie manche Menschen gestrickt sind und wie man ihnen helfen kann, wenn sie zwar um Hilfe bitten, aber praktisch völlig gelähmt und geradezu lernresistent sind, wenn sie dann auf einfachste Weise funktionierende Lösungsvorschläge bekommen und diese einfach ablehnen. Mir kommt das fast vor, wie das ständige Rennen mit dem Kopf vor/durch die Wand, weil das Brett vor'm Kopp die Sicht aufs das Schild "Tür 2m links" verhindert. Und dann wird gejammert "das funktioniert ja so gar nicht und jetzt brauch ich erst mal Aspirin" :facepalm:

...sorry... :hail:

Was ist an meiner Lösung verkehrt, einfach in die Service-Units aller zu überwachenden Dienste jeweils ein solches Statement einzutragen:

Code: Alles auswählen

OnFailure=daemon@test_daemon.service
Statt meinem Beispiel "test-daemon" (für den Instanz-Namen) trägt man einfach den jeweiligen Dienstenamen ein oder ein beliebiges anderes Wort ... das wars. Der Name der aufgerufenen Unit muss natürlich auch nicht zwingend "daemon" lauten, der kann selbstverständlich auch "instanzen-reporter.service" sein oder sonstwie heissen.

Dann bekommt die homebridge-Service-Unit als Beispiel einen solchen Eintrag:

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge.service
und für den zweiten zu überwachenden Dienst in der Service-Unit "pusemuckel.service den Eintrag:

Code: Alles auswählen

OnFailure=instanzen-reporter@pusemuckel.service
und so weiter, für alle zu überwachenden Services.

Den Rest macht dann eben diese zweite Unit, die in meinem ersten Beispiel einen Logeintrag erstellt, im zweiten Beispiel direkte eine Telegram-Nachricht versendet, und als drittes Beispiel natürlich auch ein beliebiges Script aufrufen könnte. Was ist verkehrt an solch einfachen Lösungen, die ohne Probleme, ohne Aufwand, ohne Fehler, ohne kompliziert zu sein, einfach zuverlässig das Problem rundherum lösen? Taugen solche einfachen Lösung nicht für das eigene Ego, das gerne mit was richtig Fetten und komplizierten angeben möchte? Welchen Grund kanns sonst haben, eine schlechte und nichtfunktionierende Lösung so hartnäckig weiter zu verfolgen? Etwas unsinnigeres als die Journal-Auswertung als Eventhandler zu missbrauchen, kann ich mir speziell bei diesem Problem eigentlich nicht vorstellen. Du hättest dieses wirklich einfache Problem eigentlich schon seit Tagen abschließend lösen können.

Ich würde das ja noch verstehen, wenn man eine grundsätzliche Abneigung bezüglich systemd hat... aber wenn man nicht mal weiss, was systemd überhaupt ist, was es kann und was es tut, entzieht sich diese Ablehnung völlig meinem Verstehen. Und wenn ich dann noch "sudo" lese, auf einem Haus-Automatisierungssystem, auf das via proprietärer Software von Smartphones zugegriffen wird, und dann hat der User sogar noch via "sudo" admin-Rechte ... wahrscheinlich auch noch ohne Password-Abfrage... da denke ich mir "noch schlimmer geht es eigentlich nicht mehr...." und erinnere mich an Einsteins Vergleich mit dem Universum....

Entschuldige bitte, weil ich das jetzt hier mal rauslassen musste... aber bei manchen Dingen bin ich so sprachlos, dass ich meine Klappe einfach nicht mehr halten kann... :facepalm:

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

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

Beitrag von NAB » 01.03.2018 16:42:31

Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 14:19:20
Wenn ich das mal wüsste :cry:
Also an deiner Stelle würd mich das ja interessieren ... entweder hast du einen Fehler gemacht oder die Sache ist unzuverlässig. Und einen unzuverlässigen Benachrichtigungsdienst brauchst du nicht.
Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 14:19:20
Du hast Recht, vom Grundsatz kann ich garnicht mehrere Dienste mit dieser Variante Überwachen. Bei den Homebridge Instanzen funktioniert es glücklicherweise da diese alle den gleichen Namen haben
Dann guck dir mal die Gebrauchsanweisung zu journalctl an:
https://www.freedesktop.org/software/sy ... alctl.html
Insbesondere den Abschnitt zu --unit:
-u, --unit=UNIT|PATTERN

Show messages for the specified systemd unit UNIT (such as a service unit), or for any of the units matched by PATTERN. If a pattern is specified, a list of unit names found in the journal is compared with the specified pattern and all that match are used. For each unit name, a match is added for messages from the unit ("_SYSTEMD_UNIT=UNIT"), along with additional matches for messages from systemd and messages about coredumps for the specified unit.

This parameter can be specified multiple times.
Beachte den letzten Satz.

Die Optionen --priority und --output sind vielleicht auch interessant für dich - damit kannst du noch etwas beeinflussen, was und wie angezeigt wird.

Das Ubuntu-Wiki erklärt ein klein wenig auf Deutsch:
https://wiki.ubuntuusers.de/systemd/journalctl/
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: Gelöst! Shell Skript für systemd Überwachung

Beitrag von Nastra » 01.03.2018 19:39:49

@NAB
entweder hast du einen Fehler gemacht
Das wird es sein, da bis jetzt jede Meldung angekommen ist die ich verursacht habe.

Danke für die Links, ich habe das Skript zum testen jetzt angepasst, es läuft auch und reagiert auf die homebridge Meldung. Beim Backup was ich zum testen mit reingenommen habe reagiert er nicht. Ich vermute mal das es jetzt was mit dem Inhalt der Unit zutun hat? Oder ist ein Fehler im Skript? Habe das -t noch drinnen gelassen :wink:

Skript:

Code: Alles auswählen

#!/bin/bash                                                                                                  
journalctl -u homebridge-test -u backup -f --since "now" |                                                                     
grep --line-buffered "code=exited|USB-stick"                                                                      
sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
Unit:

Code: Alles auswählen

[Unit]
Description=instanzen-reporter
After=network.target
Wants=homebridge.service

[Service]
Type=simple
ExecStart=/usr/local/bin/instanzen-reporter.sh
Restart=always
SyslogIdentifier=instanzen-reporter.service

[Install]
WantedBy=multi-user.target


@TomL

Hey, habe doch geschrieben das ich deine Lösung auf jeden Fall testen möchte, aber das muss ja nicht ausschließen das ich auch an der Lösung mit dem Skript weiter interessiert bin. Allein weil ich ich das Thema mittlerweile recht spannend finde und schon einiges dazu gelernt habe dank euch. Das wissen kann man bestimmt irgendwann nochmal gebrauchen :wink:

Also, ich habe jetzt gemäß deiner Anleitung die zwei Units angelegt und den Daemon. Habe hier aber noch etwas Probleme mit einem Fehler der mir beim Aktivieren einer Unit ausgegeben wird. Siehe Nr.2. Daher würde ich dich bitten mir da nochmal etwas unter die Arme zu greifen um die Sache an mein System anzupassen.

1.) Der Daemon selber ist wenn ich es richtig sehe ist ja ein Hintergrunddienst wird dieser auch mit .sh am ende

Code: Alles auswählen

daemon.sh
angelegt oder einfach nur

Code: Alles auswählen

deamon
?

2.) Ich möchte gerne den Daemon im Verzeichnis

Code: Alles auswählen

/usr/local/bin
anlegen. Ist das grundsätzlich möglich? Ich habe es probiert aber bekomme beim Sterbenden Daemon einen OnFailure= Fehler mit Hinweis auf den Pfad beim Aktivieren was vermutlich mit dem Pfad unter

Code: Alles auswählen

ExecStart=
zusammenhängt. Ich habe hier einiges ausprobiert aber es wollte irgendwie nicht so richtig klappen. Wie müsste der Pfad jetzt aussehen wenn der Damon unter

Code: Alles auswählen

/usr/local/bin/deamon.sh
abgelegt ist?

3. Muss beim Ausrufer der

Code: Alles auswählen

ExecStart=
auch noch angepasst werden?

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

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

Beitrag von NAB » 01.03.2018 20:35:41

Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 19:39:49
Danke für die Links, ich habe das Skript zum testen jetzt angepasst, es läuft auch und reagiert auf die homebridge Meldung. Beim Backup was ich zum testen mit reingenommen habe reagiert er nicht.
Du meinst, das Script, so wie es da steht, reagiert auf "homebridge-test"? Das überrascht mich etwas ... aber schauen wir mal ...
Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 19:39:49
Ich vermute mal das es jetzt was mit dem Inhalt der Unit zutun hat? Oder ist ein Fehler im Skript?

Skript:

Code: Alles auswählen

#!/bin/bash                                                                                                  
journalctl -u homebridge-test -u backup -f --since "now" |                                                                     
grep --line-buffered "code=exited|USB-stick"                                                                      
sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
Mit der Unit dürfte das nichts zu tun haben. Die soll ja nur das Script starten, daran hat sich nichts geändert. Allerdings startet deine Unit kein "backup.service". Dass "backup.service" laufen muss, damit du Nachrichten von "backup" bekommst, ist logisch, ja?

Ich vermute, es liegt am Script. Du kannst mal wieder ne Trockenübung machen:

Code: Alles auswählen

journalctl -u homebridge-test -u backup -f --since "now"
Du solltest eigentlich Meldungen von "homebridge-test" und "backup" sehen können. Klappt das? Wenn vorne nichts reinkommt, kann hinten ja auch nichts rauskommen.

Mit dem grep hast du schon eine gute Idee gehabt ... so ähnlich hatte ich mir das auch vorgestellt. Aber ... ich mach da mal ne Trockenübung, ja?

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei"
eins
zwei
drei
Gut, so gibt er mir schon mal drei Zeilen aus. Jetzt nehme ich grep dazu:

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei" | grep --line-buffered "eins"
eins
Geht! Und jetzt mit dem senkrechten Strich (der hat für grep nämlich auf einmal ne andere Bedeutung, nämlich "oder"):

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei" | grep --line-buffered "eins|drei"
$
Das klappt bei mir gar nicht. Du erzählst, es klappt bei dir zur Hälfte ... das wundert mich. Eigentlich weiß grep nämlich gar nicht, dass der senkrechte Strich eine besondere Bedeutung hat. Eventuell hast du ein anderes grep als ich?

Es gibt hier zwei mögliche Schreibweisen. Die erste ist, dass wir grep mit einem -e sagen, wonach es suchen soll. Und -e darf man wieder mehrmals verwenden:

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -e "eins" -e "drei"
eins
drei
Die zweite ist, dass wir grep mit einem großen -E sagen, dass es den senkrechten Strich als "oder" auffassen soll:

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -E "eins|drei"
eins
drei
Welche Variante du nun nimmst, ist Geschmackssache. Ich finde die erste übersichtlicher ... gerade wenn dein Script nach noch mehr Schlüsselworten suchen soll.

P.S.: Was die Sache mit der Systemd-Unit angeht ... ist /usr/local/bin/deamon.sh ausführbar? Also klappt
sudo /usr/local/bin/deamon.sh
?
Never change a broken system. It could be worse afterwards.

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

TomL

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

Beitrag von TomL » 01.03.2018 20:44:43

Ok... also noch mal im einzelnen...

Es gibt verschiedene Möglichkeiten zur Lösung dieses Problems:
1. Zyklisch per cron einen Journal-Grep-Auswerte-Job starten und bei gefundenen Problemen etwas tun. Das geht, ist aber eine dumme Lösung, die aufwendig auswerten muss, weil ja auch mehrere Prozesse sterben können.
2. Einen Daemon installieren, also ein Programm, welcher permanent im Hintergrund läuft und "journalctl -f" mit "grep" auswertet, was m.M.n. so ziemlich die dümmste Lösung überhaupt ist.

Diese beiden ersten Varianten sind sowas wie pseudo-Eventhandler... also ganz ähnlich wie ein Marathon-Läufer auf Krücken.

3. Den Eventhandler von systemd selber nutzen, weil es den genau für diesen Zweck gibt.

Die dritte Variante ist die richtige Lösung, als vergiss das mit dem Daemon... ein solche Lösung ist Schrott! Lege die beiden folgenden Dateien an. Zuerst das Script, welches hier nur einen Log-Eintrag schreibt. Aber da kannst Du alles, was Du willst, eintragen oder lösen lassen, eben auch das Senden einer Nachricht per Telegram. Ich habe diese ntf-Zeile da reinkopiert, aber mit # kommentiert, weil ich die Syntax nicht kenne.

Code: Alles auswählen

nano /usr/local/bin/instanzen-reporter

Code: Alles auswählen

#!/bin/bash

echo "Send Message $1 exited" | systemd-cat -t "$(basename $0)" -p "info"
#ntfy -b telegram send '$1 Instanz ausgefallen'

exit 0
Und als nächstes die Service-Unit, die das Script automatisch bei einem Ausfall-Event startet:

Code: Alles auswählen

nano /etc/systemd/system/instanzen-reporter@.service

Code: Alles auswählen

[Unit]
Description=Sende Nachricht über ausgefallene Prozesse

[Service]
Type=oneshot
RemainAfterExit=no

ExecStart=/usr/local/bin/instanzen-reporter %I 

[Install]
WantedBy=multi-user.target
Die Besonderheit ist hier die mit @ vorgegebene Instantiierung, die eine Unit mehrfach nutzbar macht... also auf das Zeichen @ achten! Jetzt brauchst Du nur noch in jede zu überwachende Service-Unit das folgende Statement in der Unit-Section eintragen, jeweils mit einem eigenem Instanz-Namen. Ich würde hier den Namen des überwachten Services nehmen... als 1 Wort

1.Unit für den Dienst homebridge

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge.service
2. Unit für den Dienst pusemuckel

Code: Alles auswählen

OnFailure=instanzen-reporter@pusemuckel.service
3. Unit für den Dienst irgendwas

Code: Alles auswählen

OnFailure=instanzen-reporter@irgendwas.service
Du solltest Dich nur an die von mir gewählten Pfade halten, weil das auch die Defaultpfade sind, mit denen es sofort funktioniert. Die Rechte für Script und Service sind root:root, das Script 755, die Service-Unit 644.... bitte unbedingt dran halten.

Das wars... mehr ist nicht notwendig.... Darüber hinaus musst Du -sofern das notwendig ist- nur noch das Script anpassen.

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

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

Beitrag von Nastra » 01.03.2018 22:49:54

Hey ho,

vielen Dank für die schnellen Antworten euch beiden!

@TomL Es funktioniert :THX: :THX: :THX: so wie du es diesmal beschrieben hast war es auch für einen nicht so versierten
Linux User wie mich sofort nachvollziehbar. Klasse!

Zwei Dinge hätte ich noch auf dem Herzen,

1.)
Die Besonderheit ist hier die mit @ vorgegebene Instantiierung, die eine Unit mehrfach nutzbar macht... also auf das Zeichen @ achten! Jetzt brauchst Du nur noch in jede zu überwachende Service-Unit das folgende Statement in der Unit-Section eintragen, jeweils mit einem eigenem Instanz-Namen. Ich würde hier den Namen des überwachten Services nehmen... als 1 Wort

Unit für den Dienst homebridge
CODE: ALLES AUSWÄHLEN
OnFailure=instanzen-reporter@homebridge.service
Wenn ich dich richtig verstehe sollte in der Unit der jeweiligen Homebridge Instanz die Zeile in der Section Unit so aussehen bzw. ergänzt werden gem. deinem Beispiel?

Code: Alles auswählen

[Unit]
Description=homebridge-test.service 
After=syslog.target network-online.target
OnFailure=instanzen-reporter@homebridge-test.service

[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
Bei mir hat es nur funktioniert wenn ich die Zeile so eingefügt habe ohne das @:

Code: Alles auswählen

OnFailure=instanzen-reporter
mit @ habe ich diese Fehlermeldung wieder bekommen:

Code: Alles auswählen

homebridge-test.service: Failed to enqueue OnFailure= job: No such file or directory


2.) Bei der Skript Lösung hatte ich zum Schluss die komplette Ausgabe der Journal Zeile im Telegram Messenger:

Code: Alles auswählen

Achtung - Mär 01 17:01:02 HomeKitServer systemd[1]: homebridge-test.service: Main process exited, code=exited, status=143/n/a
Wie müsste ich jetzt in dem Skript von dir die Zeile für ntfy anpassen, habe schon die Sachen ausprobiert die ich mit @NAB gemacht habe aber da scheint wohl ein unterschied zu sein zu xargs? Das mochte er garnicht :roll:

So sieht diese zurzeit aus:

Code: Alles auswählen

sudo -u pi ntfy -b telegram send 'Instanz ausgefallen'
@NAB Deine Antwort bzw. das Prüfen des Skript werde ich wohl aufs We verschieben müssen, da es jetzt schon spät ist und morgen die Familie mich größtenteils gebucht hat :?

lg

TomL

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

Beitrag von TomL » 01.03.2018 23:21:52

Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 22:49:54
Wenn ich dich richtig verstehe sollte in der Unit der jeweiligen Homebridge Instanz die Zeile in der Section Unit so aussehen bzw. ergänzt werden gem. deinem Beispiel?

Code: Alles auswählen

[Unit]
Description=homebridge-test.service 
After=syslog.target network-online.target
OnFailure=instanzen-reporter@homebridge-test.service
:::
Ja, genau so ist es richtig! Die Unit instanzen-reporter@.service wird damit unter dem Namen instanzen-reporter@ homebridge-test.service gestartet. Als Instanzname dieser gestarteten Unit wird hier "homebridge-test" verwendet. Instanzname bedeutet, man kann die gleiche Unit unter verschiedenen Namen starten, jede Instanz mit einem eigenen Namen.... und ganz am Ende dabei an den Parameter %I denken, der auch den Instanznamen enthält und der in der gestarteten Unit zur Übergabe an das Script weiterverwendet wird.
Nastra hat geschrieben: ↑ zum Beitrag ↑
01.03.2018 22:49:54
Bei mir hat es nur funktioniert wenn ich die Zeile so eingefügt habe ohne das @:

Code: Alles auswählen

OnFailure=instanzen-reporter
mit @ habe ich diese Fehlermeldung wieder bekommen:....
Dieses OnFailure-Statement ist so falsch. Damit würde die Unit "static" aufgerufen werden und Du kannst hierbei keine Nachricht übergeben, welcher Dienst ausgefallen ist, wozu ja der Instanzname verwendet wird. Wenn der o.g. Fehler entsteht, wurde die Instanz-Unit nicht gefunden und Du hast vermutlich irgendwo einen Fehler eingebaut. Kontrolliere mal, ob es diese Datei gibt, das ist die Unit, die gestartet wird bzw. gestartet werden soll.... und auch hier auf das @ achten:

Code: Alles auswählen

cat /etc/systemd/system/instanzen-reporter@.service
Erst dieses @ ermöglicht, dass diese Unit unter dem übergebenen Instanz-Namen gestartet wird. Uns interessiert aber hier an dieser Stelle nicht der Instanz-Name und das die Unit unter diesem Namen läuft, sondern der unter %I übergebene Name wird einfach weitergegeben an das Script, welches damit den Namen des ausgefallenen Dienstes erfährt und seine Telegram-Nachticht senden kann.

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

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

Beitrag von Nastra » 02.03.2018 07:01:57

Nach dem ich das vergessene @ mit in den Namen aufgenommen habe beim reporter

Code: Alles auswählen

instanzen-reporter@.service
funktioniert es auch mit der Zeile

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge-test.service
in der Homebridge Unit.

Code: Alles auswählen

pi@HomeKitServer:~ $ sudo cat /etc/systemd/system/instanzen-reporter@.service
[Unit]
Description=instanzen-reporter@.service

[Service]
Type=oneshot
RemainAfterExit=no

ExecStart=/usr/local/bin/instanzen-reporter %I

[Install]
WantedBy=multi-user.target
Ich bekomme jetzt als Push Nachricht das hier ausgegeben:

Code: Alles auswählen

$1 Instanz ausgefallen
das $ Zeichen ist ja mit in der Nachricht, hätte es jetzt eher außerhalb erwartet im Code. Hat es eine bestimmte Bedeutung an dieser Stelle?

Was mir jetzt auch noch nicht richtig klar ist an welcher Stelle genau das zusätzlich eingetragen werden muss das der Name übernommen wird. Bisher steht es nur hier in der oben gezeigten

Code: Alles auswählen

instanzen-reporter@.service
Unit unter

Code: Alles auswählen

ExecStart=/usr/local/bin/instanzen-reporter %I
Ich habe es hier probiert, ging natürlich wieder nicht :(

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge-test.service %I
oder hier

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge-test%I.service
Zuletzt geändert von Nastra am 02.03.2018 08:48:50, insgesamt 1-mal geändert.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 07:49:32

@NAB

Habe gerade unverhofft doch noch etwas Zeit gefunden an unserem Skript weiter zu testen :mrgreen:

Also ich denke ich habe den Fehler gefunden weswegen es scheinbar bei mir ging mit

Code: Alles auswählen

"code=exited|USB-stick"
eigentlich geht es doch nicht, ich vermute das ich vergessen habe den Instanzen-reporter.service einen restart zu verpassen das er die alten Daten gezogen hatte und ich es nicht mitbekommen habe. Daher auch keine Reaktion auf Backup auch wenn ich dieses über die Unit gestartet hatte. :roll:

Ich habe das Skript testweise mit der neuen Zeile ausgestattet

Code: Alles auswählen

#!/bin/bash                                                                                                  
journalctl -u homebridge-test -u homebridge-hue -f --since "now" |                                                                     
grep --line-buffered -e "exit" -e "exited"                                                                       
sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
diese funktioniert auch gem. Status und er findet die Suchbegriffe aber nicht getrennt für die einzelnen Units. Also er sucht in beiden Units nach beiden Suchbegriffen.

Code: Alles auswählen

pi@HomeKitServer:~ $ sudo systemctl status reporter-homebridge.service
● reporter-homebridge.service
   Loaded: loaded (/etc/systemd/system/reporter-homebridge.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-03-02 08:50:25 CET; 38s ago
 Main PID: 18734 (reporter-homebr)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/reporter-homebridge.service
           ├─18734 /bin/bash /usr/local/bin/reporter-homebridge.sh
           ├─18735 journalctl -u homebridge-test -u homebridge-hue -f --since now
           └─18736 grep --line-buffered -e exit -e exited

Mär 02 08:50:25 HomeKitServer systemd[1]: Started reporter-homebridge.service.
Mär 02 08:50:43 HomeKitServer reporter-homebridge.service[18734]: Mär 02 08:50:43 HomeKitServer systemd[1]: homebridge-hue.service: Main process exited, code=exited, status=143/n/a
Mär 02 08:50:43 HomeKitServer reporter-homebridge.service[18734]: Mär 02 08:50:43 HomeKitServer systemd[1]: homebridge-hue.service: Failed with result 'exit-code'.
Mär 02 08:50:55 HomeKitServer reporter-homebridge.service[18734]: Mär 02 08:50:55 HomeKitServer systemd[1]: homebridge-test.service: Main process exited, code=exited, status=143/n/a
Mär 02 08:50:55 HomeKitServer reporter-homebridge.service[18734]: Mär 02 08:50:55 HomeKitServer systemd[1]: homebridge-test.service: Failed with result 'exit-code'.
Es wird aber keine Pushnachricht mehr erzeugt? Ich gehe mal davon aus das jetzt

Code: Alles auswählen

sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
nicht mehr passt und geändert werden muss?

TomL

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

Beitrag von TomL » 02.03.2018 10:14:09

Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 07:01:57
Ich bekomme jetzt als Push Nachricht das hier ausgegeben:

Code: Alles auswählen

$1 Instanz ausgefallen
das $ Zeichen ist ja mit in der Nachricht, hätte es jetzt eher außerhalb erwartet im Code. Hat es eine bestimmte Bedeutung an dieser Stelle?

Was mir jetzt auch noch nicht richtig klar ist an welcher Stelle genau das zusätzlich eingetragen werden muss das der Name übernommen wird. Bisher steht es nur hier in der oben gezeigten

Code: Alles auswählen

instanzen-reporter@.service
Unit unter

Code: Alles auswählen

ExecStart=/usr/local/bin/instanzen-reporter %I
Genau so ist es richtig und nur dort darf %I stehen. $1 und %I sind im übertragenen Sinn Variablen, die einen an eine Prozedur (resp. Unit) übergebenen Wert enthalten. Du kannst das Testen. Starte dazu zuerst ein Terminal, melde dich als root an und starte diesen Befehl:

Code: Alles auswählen

/usr/local/bin/instanzen-reporter TestNachricht
Dabei wird der Text "TestNachricht" an das Script übergeben und in der Variable $1 im Script zur Verfügung gestellt Du müsstest nun -wenn der Telegram-Befehl im Script korrekt ist- per Telegram eine Nachricht mit dem Inhalt "TestNachricht" erhalten.

Nun kannst Du das gleiche mit Verwendung der Service-Unit testen. Starte dazu

Code: Alles auswählen

systemctl start instanzen-reporter@TestNachricht.service
Hierbei wird der Instanzname TestNachricht (zusätzlich auch) in der Variable %I zur Verfügung gestellt. Und das ExecStart-Statement in der Service-Unit macht das gleiche, was Du zuvor manuell gemacht hast, es verwendet hier den an die Unit übergebenen und in %I enthalten Text "TestNachricht" . Also muss auch jetzt der Text "TestNachricht" als Telegram-Message ankommen. Wenn eins von beiden nicht geht, hast Du weitere Fehler eingebaut, wie das zuerst vergessene @. Eigentlich ist das total einfach... man muss nur sehr sorgfältig und fehlerfrei arbeiten... rein von der Sache ist das Anfängerschule....

Wenn das erste (das Script) schon nicht funktioniert bzw. nicht ordentlich sendet, brauchst Du mit dem zweiten Test gar nicht erst anfangen, dann ist das Script falsch. Das Script muss immer senden können, manuell gestartet oder nach einem Kill-Event eines überwachten Prozesses... das muss dem Script egal sein. Und wenns manuell nicht geht, geht es auch nicht aus der Überwachung. Und Du muss das in Deiner Betrachtung trennen: Die Überwachung ist eine Baustelle, das Senden eine andere. Beides muss jeweils auch ohne das andere funktionieren. Wenn beides funktioniert, funktioniert zwangsläufig auch das OnFailure-Statement in den zu überwachenden Units.... aber wie gesagt: dort ohne das %I
Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 07:01:57
Ich habe es hier probiert, ging natürlich wieder nicht

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge-test.service %I
oder hier

Code: Alles auswählen

OnFailure=instanzen-reporter@homebridge-test%I.service
Das ist falsch, bitte nicht solche Experimente durchführen, wenn Du gar nicht weisst, was das für Auswirkungen hat. Bitte wieder so einrichten, wie ich das beschrieben habe, also an dieser Stelle kein %I.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 10:34:07

Code: Alles auswählen

/usr/local/bin/instanzen-reporter TestNachricht

Code: Alles auswählen

sudo /usr/local/bin/instanzen-reporter TestNachricht
Funktionieren beide, ich erhalte jeweils eine Nachricht. Aber nicht mit dem Inhalt TestNachricht.

Das hier wird ausgegeben weiterhin:

Code: Alles auswählen

$1 Instanz ausgefallen

Bin gerade alles nochmal durchgegangen, sehe aber ansonsten keine Abweichung zu dem was du vorgegeben hast. Hier meine Aktuellen Einstellungen. Vielleicht siehst du ja noch einen Fehler?

Code: Alles auswählen

#!/bin/bash

echo "Send Message $1 exited" | systemd-cat -t "$(basename $0)" -p "info"

sudo -u pi ntfy -b telegram send '$1 Instanz ausgefallen'

exit 0

Code: Alles auswählen

[Unit]
Description=instanzen-reporter@.service

[Service]
Type=oneshot
RemainAfterExit=no

ExecStart=/usr/local/bin/instanzen-reporter %I

[Install]
WantedBy=multi-user.target

Code: Alles auswählen

[Unit]
Description=homebridge-test.service
After=syslog.target network-online.target
OnFailure=instanzen-reporter@homebridge-test.service 

[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
Das ist falsch, bitte nicht solche Experimente durchführen, wenn Du gar nicht weisst, was das für Auswirkungen hat. Bitte wieder so einrichten, wie ich das beschrieben, also an dieser Stelle kein %I.
Ein paar Try and Error Übungen :wink: Ab und zu kann es ja auch klappen :lol:

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 11:15:12

Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 10:34:07
Bin gerade alles nochmal durchgegangen, sehe aber ansonsten keine Abweichung zu dem was du vorgegeben hast. Hier meine Aktuellen Einstellungen. Vielleicht siehst du ja noch einen Fehler?

Code: Alles auswählen

echo "Send Message $1 exited" | systemd-cat -t "$(basename $0)" -p "info"
sudo -u pi ntfy -b telegram send '$1 Instanz ausgefallen'
Dann liegt der Fehler allein im Script... ich sehe auf Anhieb schon mal einen ... und zwar "sudo"... das ist hier definitiv überflüssig.
Das Script tut zwei Dinge, es legt einen Journal-Eintrag an und es sendet eine Nachricht... beides tut es mit der gleichen Nachricht in $1.

Schau mal nach, was im Log steht.. wenn die Nachricht da korrekt ist, ist schlichtweg der Sendebefehl falsch.

Code: Alles auswählen

journalctl -b | grep "Send Message"
Wenn Du in einem Root-Terminal diesen Befehl absetzt, muss es auch manuell funktionieren (wie gesagt OHNE sudo):

Code: Alles auswählen

ntfy -b telegram send 'TestNachricht Instanz ausgefallen'
Ich würde zusätzlich auch den ntf-Befehl mit vollständigem Pfad versehen:

Code: Alles auswählen

which ntfy
Und ich erwähne das noch mal... auf einem solchen System mit Zugang von außen solltest Du tunlichst den User "pi" entfernen, idealerweise auch die Gruppe "sudo" leeren, am Besten sogar ganz "sudo" deinstallieren und für "root" ein eigenes sehr anspruchsvolles Password vergeben.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 11:33:42

Code: Alles auswählen


Mär 02 10:33:13 HomeKitServer instanzen-reporter[29799]: Send Message TestNachricht exited
Mär 02 10:34:24 HomeKitServer instanzen-reporter[30666]: Send Message TestNachricht exited
Mär 02 10:43:53 HomeKitServer instanzen-reporter[5265]: Send Message TestNachricht exited
Sieht eigentlich gut aus oder?
Wenn Du in einem Root-Terminal diesen Befehl absetzt, muss es auch manuell funktionieren:
CODE: ALLES AUSWÄHLEN
ntfy -b telegram send 'TestNachricht Instanz ausgefallen'
Funktioniert, kommt genau so an.
ntfy -b telegram send 'TestNachricht Instanz ausgefallen'
Ich würde jeden den ntf-Befehl mit vollständigem Pfad versehen:
CODE: ALLES AUSWÄHLEN
which ntf
Erledigt, klappt auch noch :THX:

Und ich erwähne das noch mal... auf einem solchen System mit Zugang von außen solltest Du tunlichst den User "pi" entfernen, idealerweise auch die Gruppe "sudo" leeren, am Besten sogar ganz "sudo" deinstallieren und für "root" ein eigenes sehr anspruchsvolles Password vergeben.
Danke für den Hinweis. Wenn alles funktioniert werde ich mich mit dem Thema mal beschäftigen.
Zuletzt geändert von Nastra am 02.03.2018 12:02:21, insgesamt 1-mal geändert.

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 11:56:31

Also... das Fazit... die Units sind ok... die Nachricht kommt einfandfrei im Log an. Genauso müsste jetzt auch die Nachricht von den ausgefallenen Services im Log ankommen. Das heisst, an diesem Punkt muss man nichts mehr ändern. Wenn es jetzt noch Probleme beim Senden gibt, was nicht am Inhalt von $1 innerhalb des Scripts liegen kann, weil diese Nachricht in $1 ja sauber im Log ankommt, dann liegt es alleine am Sende-Befehl. Das muss man nun ausklamüsern, wie das geht.
Der Sendevorgang muss aber gleichermaßen direkt im Terminal funktionieren, mit exakt dem gleichen Statement, wie es im Script eingetragen ist. Wenn das eine nicht geht, geht das zweite auch nicht. Und wie gesagt ohne "sudo"!

Oh... hoffentlich kein Missverständnis.... Du solltest die Rückgabe aus

Code: Alles auswählen

which ntfy
vollständig so in das Script übernehmen... also nicht nur "ntfy", sondern einschließlich des ganzen Pfades.
Zuletzt geändert von TomL am 02.03.2018 11:59:35, insgesamt 1-mal geändert.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 11:59:33

Habe den Fehler gefunden. So funktioniert der Befehl und ich bekomme den Namen der Instanz mit ausgegeben:

Code: Alles auswählen

/usr/local/bin/ntfy -b telegram send $1' Achtung'


Ergebnis:

Code: Alles auswählen

homebridge/test Achtung
Oh... hoffentlich kein Missverständnis.... Du solltest die Rückgabe aus
CODE: ALLES AUSWÄHLEN
which ntfy
Habe ich auch so verstanden :D

Cool und nochmal besten danke bis hier hin :THX: :THX: :THX:

Jetzt weiss ich wie es funktioniert, habe aber noch eine Frage an dich bezüglich der nicht Homebridge Service die ich gerne Überwachen möchte. Wir haben ja in der Homebridge Unit OnFailure genutzt um dem Instanzen.reporter mitzuteilen das er tätig wird und das Skript auslöst.

Kann ich mit dieser Lösung auch individuelle Dinge überwachen wie ein Backup ist abgeschlossen welches durch einen eigenen Service angesteuert wird? Denke OnFailure wird da nicht klappen :?:

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 12:04:26

Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 11:59:33
Kann ich mit dieser Lösung auch individuelle Dinge überwachen wie ein Backup ist abgeschlossen welches durch einen eigenen Service angesteuert wird? Denke OnFailure wird da nicht klappen
Ja, sicher... ich weiss nur nicht, ob das sinnvoll ist. Statt

Code: Alles auswählen

systemctl start instanzen-reporter@BackupFertig.service
kann man den ntfy-Befehl auch direkt im Backup-Job eintragen.

Wichtig ist nur eines noch... beschränke Dich unbedingt darauf, nur EinWort-Instanzen zu nehmen... keine Blanks, keine Sonderzeichen... das ist eigentlich nicht als Nachrichtensystem gedacht, sondern um Units instantiiert starten zu können... und instanzen sollten einen eindeutigen einfachen Namen haben, der nicht zur Konflikten mit systemd führt.... was ich bei Sonderzeichen nicht für ausgeschlossen halte.

Die "Nachricht"

Code: Alles auswählen

homebridge/test
solltest Du besser so gestalten

Code: Alles auswählen

homebridge_test
und unbedingt auf / verzichten.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 12:16:38

Im Backup-Job meinst du die Unit vom Backup Service, also auch bei OnFailure?

Ich weiß garnicht wo das / in der Nachricht her kommt. Der Befehl ist so definiert wie in dem Beispiel ein post über dir mit Achtung.

Edit:
Ok, fehler auch gefunden er erkennt in der OnFailure Zeile das - bei homebridge-test als /.

Habe es jetzt zum Testen auf einen _ geändert dann kommt es so an:

Code: Alles auswählen

homebridge_test Achtung

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 12:43:23

Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 12:16:38
Im Backup-Job meinst du die Unit vom Backup Service, also auch bei OnFailure?
Keine Ahnung... weiss ja nicht, wie Du das Backup handhabst...ob das ein Script ist, oder ein Programm... ob das manuell gestartet wird, via Cron, via service-unit und systemd-timer. Wenn das nur ein Script ist, kann man den ntfy ja auch direkt ins Script einbauen... also das würde ich eher nicht über OnFailure lösen... sondern besser über Mail-Benachrichtigungen.

Ich habe heute morgen von meinem Server im Keller eine Mail bekommen, mit der ich informiert werde, dass er die Homedirs gesichert und nach extern übertragen hat:

Code: Alles auswählen

xtbak - SIK SSD-Home (raspi):
02.03.2018-05:00:12: Create Tarfile started
02.03.2018-05:06:30: Create Tarfile done (RC=0)
02.03.2018-05:06:30: md5checksum started
02.03.2018-05:07:00: md5checksum done (RC=0)
02.03.2018-05:07:00: Test Tarfile started
02.03.2018-05:07:52: Test Tarfile done (RC=0)
02.03.2018-05:08:02: Encrypt Tarfile started
02.03.2018-05:09:48: Encrypt Tarfile done (RC=0)
02.03.2018-05:09:49: FTP-Send encrypted File started
02.03.2018-05:24:49: FTP-Send encrypted File done (RC=0)
Sowas krieg ich 12 mal monatlich plus täglich das Ergebnis des rsync-Laufes. Wenn es Dich interessiert, kann ich Dir nen Link senden, wie ich meine Backups durchführe.... ist aber ziemlich umfangreich beschrieben.... nicht nur das wie, sondern auch das warum und was.

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

Re: Shell Skript für systemd Überwachung

Beitrag von Nastra » 02.03.2018 13:17:25

Das Backup erstelle ich über einen timer.service der einen backup.service anstößt und anschließend ein Skript ausführt was alle Homebridge Service abschaltet und ein vollständiges Image über dd erstellt.

Das funktioniert seit längerem sehr gut. Bei mir sind es nur 8GB auf einem USB 3 Stick die gesichert werden müssen da ich das OS nicht als Produktionssystem nutze sondern ausschließlich als Homebridge Server.

Ich denke ich bleibe erstmal bei dieser Variante, trotzdem vielen Dank für das Angebot.

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 » 02.03.2018 17:53:51

Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 07:49:32
Ich habe das Skript testweise mit der neuen Zeile ausgestattet

Code: Alles auswählen

#!/bin/bash                                                                                                  
journalctl -u homebridge-test -u homebridge-hue -f --since "now" |                                                                     
grep --line-buffered -e "exit" -e "exited"                                                                       
sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
diese funktioniert auch gem. Status
Gut. Also die erste Zeile funktioniert :)
Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 07:49:32
und er findet die Suchbegriffe aber nicht getrennt für die einzelnen Units. Also er sucht in beiden Units nach beiden Suchbegriffen.
Das ist logisch. Das kann "grep" nicht. grep kriegt eine Zeile nach der nächsten vorgelegt und durchsucht sie nach den angegebenen Suchbegriffen. Insbesondere enthält "exited" schon das Wort "exit" also findet "exit" beide Varianten: "exit" und "exited".

Das ist genau der Punkt, an dem wir jetzt tricksen müssen. Und das ist der Punkt, an dem ich dir nur begrenzt verraten kann, wie es geht, weil ich nicht genau weiß, was für Zeilen du angezeigt bekommen möchtest und welche nicht. Mir ist schon in deinem Beispiel nicht klar, bei welchen Zeilen du nur ein "exited" sehen möchtest und bei welchen ein "exit". Die einfachste Möglichkeit um zu verhindern, dass "exit" und "exited" verwechselt werden ist natürlich, einfach das Zeichen anzugeben, das nach "exit" kommen soll, also zum Beispiel "exit " (mit einem Leerzeichen dahinter). Sowas kommt in deinem Beispiel aber gar nicht vor.

"grep" kennt ein paar geheime Zeichen, zum Beispiel den Punkt . und den Stern *

Der Punkt steht stellvertretend für EIN beliebiges Zeichen. Der Stern bedeutet, dass das Zeichen davor sich beliebig oft wiederholen darf. Somit steht .* für beliebig viele beliebige Zeichen. Ein paar einfache Beispiele:

Code: Alles auswählen

$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -e "eins" -e "drei"
eins
drei
$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -e "eins" -e "d.ei"
eins
drei
$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -e "eins" -e "d.*ei"
eins
drei
$ echo -e "eins\nzwei\ndrei" | grep --line-buffered -e "eins" -e "d.*i"
eins
drei
Das sind jetzt ziemlich langweilige Beispiele ... wie kannst du die bei dir umsetzen? Zum Beispiel so:

Code: Alles auswählen

grep --line-buffered -e "homebridge-hue.*start" -e "homebridge-test.*exited"
Das zeigt dir von "homebridge-hue" nur noch Zeilen an, die "start" enthalten und von "homebridge-test" nur noch Zeilen, die "exit" enthalten (hoffentlich, ich mach hier ja mal wieder Trockenübungen;)

Du musst da ein paar graue Zellen reininvestieren um möglichst präzise die Zeilen rauszufiltern, die du haben willst ohne dass die grep-Zeile zu unübersichtlich wird. Das Beispiel von eben ließe sich vermutlich verkürzen auf:

Code: Alles auswählen

grep --line-buffered -e "hue.*start" -e "test.*exited"
Nastra hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 07:49:32
Es wird aber keine Pushnachricht mehr erzeugt? Ich gehe mal davon aus das jetzt

Code: Alles auswählen

sudo -u pi xargs -L1 -t -I '$' ntfy -b telegram send 'Achtung - ''$'
nicht mehr passt und geändert werden muss?
Nein, daran liegt's nicht.
Wie schon erklärt, schweißt du deine drei Befehle mit dem senkrechten Strich zusammen:
journalctl | grep | xargs
Du hast den Strich hinter grep jetzt weggelassen. xargs kriegt also gar keine Eingaben mehr und guckt in die leere Röhre.
TomL hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 11:15:12
Dann liegt der Fehler allein im Script... ich sehe auf Anhieb schon mal einen ... und zwar "sudo"... das ist hier definitiv überflüssig.
Das ist nicht überflüssig sondern sorgt dafür, dass er ein komisches Pythonscript aus Drittquellen nicht als root ausführt. Was du da empfiehlst ist fahrlässig.
Never change a broken system. It could be worse afterwards.

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

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 21:14:08

NAB hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 17:53:51
Was du da empfiehlst ist fahrlässig.
:D

Das sagt der systemd-Gegner.... :D :D :D ... systemd-Services werden automatisch mit root-Rechten ausgeführt... und meine Lösung ist eine reine systemd-Lösung. "sudo" ist an der Stelle falsch.

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 » 02.03.2018 21:51:13

TomL hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 21:14:08
Das sagt der systemd-Gegner.... :D :D :D ... systemd-Services werden automatisch mit root-Rechten ausgeführt... und meine Lösung ist eine reine systemd-Lösung. "sudo" ist an der Stelle falsch.
Geil ... drei Fehler in zwei Zeilen ... Respekt! *g*
Never change a broken system. It could be worse afterwards.

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

TomL

Re: Shell Skript für systemd Überwachung

Beitrag von TomL » 02.03.2018 22:01:30

NAB hat geschrieben: ↑ zum Beitrag ↑
02.03.2018 21:51:13
Geil ... drei Fehler in zwei Zeilen ... Respekt! *g*
Ok... bitte helfe mir... ich sehe die nicht.... wo?

Antworten