shellscript-Kontrolle
shellscript-Kontrolle
Wie stelle ich fest, ob ein bestimmtes Dauer-Kommando ausgeführt wird. Erläuterung: Ich lasse nach dem Rechnerstart über rc.local per Shellscript einen Dauerping auf einen anderen Rechner ausführen. Wie kontrolliere ich, ob das Kommando läuft? Kann ich das in einem Log sehen? (Ich versuche eine Sicherung einzubauen, die das Kommando abbricht, wenn der andere Rechner nicht erreichbar ist.)
Grüße, Günther
Grüße, Günther
Re: shellscript-Kontrolle
ps? pidof? lsof?
Ich hätte ja gesagt: schreib’ dir ‘ne Unit und lass’ systemd sich drum kümmern, aber den neumodischen Kram magst ja nicht
Alternativ ping halt aus dem Script heraus mit ›-c 1‹ in ’ner Schleife aufrufen und seinen Rückgabewert auswerten → bei ≠0 die Schleife verlassen und tun, was auch immer bei Unerreichbarkeit getan werden soll. Das Problem ansonsten wird sein, dass ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft.
Ich hätte ja gesagt: schreib’ dir ‘ne Unit und lass’ systemd sich drum kümmern, aber den neumodischen Kram magst ja nicht
Alternativ ping halt aus dem Script heraus mit ›-c 1‹ in ’ner Schleife aufrufen und seinen Rückgabewert auswerten → bei ≠0 die Schleife verlassen und tun, was auch immer bei Unerreichbarkeit getan werden soll. Das Problem ansonsten wird sein, dass ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft.
Re: shellscript-Kontrolle
Eben, deswegen baue ich ja eine Sicherung ein. Soweit habe ich die Sache im Griff, nun würde ich aber testweise gerne schauen, ob die auch greift oder ob ich Mist gebaut habe.niemand hat geschrieben:Das Problem ansonsten wird sein, dass ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft.
Werde ich mir anschauen. Danke!niemand hat geschrieben:ps? pidof? lsof?
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: shellscript-Kontrolle
Schreib' Doch nochmal genauer, was Du tun willst. Was wird im Normalfall ausgeführt, was dann abgebrochen werden soll?
Re: shellscript-Kontrolle
ping loggt nichts, das schreibt nur auf Standard-Out und Standard-Error.guennid hat geschrieben:Ich lasse nach dem Rechnerstart über rc.local per Shellscript einen Dauerping auf einen anderen Rechner ausführen. Wie kontrolliere ich, ob das Kommando läuft?
Du könntest aber ein kleines Script schreiben, das alle paar Sekunden ein einzelnes Ping auf den Rechner losläßt und das Ergebnis untersuchen:
Code: Alles auswählen
#!/bin/bash
# Konfiguration:
HOST=Rechnername oder IP
INTERVALL=60
while true
do
ergebnis=`ping -q -c 1 $HOST | grep "100%"`
if test -n "$ergebnis"
then
logger Rechner $HOST nicht erreichbar
fi
sleep $INTERVALL
done
Re: shellscript-Kontrolle
Nochmal: Das Problem ist nicht der ping, bzw. das ihn enthaltende script, sondern die Verifizierung/Falsifizierung des pings. lsof scheint das herzugeben, bin ich aber noch nicht vertraut mit, muss ich erst mal studieren.
(60 Sek. sind übrigens zu lang, er läuft alle 10 Sek.)
Grüße, Günther
(60 Sek. sind übrigens zu lang, er läuft alle 10 Sek.)
Grüße, Günther
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: shellscript-Kontrolle
...sondern die Verifizierung/Falsifizierung des pings...
Code: Alles auswählen
if ping -c3 -w5 host >/dev/null 2>&1; then
echo ping erfolgreich
# weitere aktionen wenn erfolgreich
else
echo ping fehlgeschlagen
# weitere aktionen wenn erfolgreich
fi
Code: Alles auswählen
#!/bin/bash
function ping_watchdog {
WATCH_HOST="$1"
CHECK_INTERVAL="$2"
# Beenden, wenn vom Hauptprogramm das Signal zum Beenden kommt.
trap return USR1
while :; do
if ! ping -c1 -w3 $WATCH_HOST >/dev/null 2>&1 ; then
# Wenn nicht erreichbar, Hauptprogramm abschiessen
logger "Host $WATCH_HOST nicht erreichbar, beende Hauptprogramm $(basename $0)"
kill -1 $$
return
fi
sleep $CHECK_INTERVAL
done
}
ping_watchdog 192.168.50.199 5 &
WATCHDOG_PID="$!"
# Hauptprogramm startet hier
#
# ...
# ...
#
# Hauptprogramm endet hier
# echo "Programmende. Beende Watchdog $WATCHDOG_PID ..."
kill -USR1 $WATCHDOG_PID
wait $WATCHDOG_PID
Re: shellscript-Kontrolle
@heisenberg
Den Parameter -c habe ich bisher nicht benutzt. Ich verstehe einfach nicht, was die (englische) manpage mir dazu zu sagen hat.
Das Kommando, das ich dauerhaft per /etc/rc.local absetzen will, ist: Soweit ich das verstehe, wird damit alle fünf Sekunden ein ping abgesetzt, dessen Ergebnis nirgendwo rückgemeldet wird.
Und mit der Kontrolle geht's darum, zu verhindern dass:
Danach (oder mit denen ) melde ich mich wieder.
Grüße, Günther
Den Parameter -c habe ich bisher nicht benutzt. Ich verstehe einfach nicht, was die (englische) manpage mir dazu zu sagen hat.
Das Kommando, das ich dauerhaft per /etc/rc.local absetzen will, ist:
Code: Alles auswählen
ping -i 5 [Rechner/IP] > /dev/null 2>&1 &
Und mit der Kontrolle geht's darum, zu verhindern dass:
Aber bevor ich mich diesem ping wieder zuwende, muss ich auf dieser Maschine zunächst noch andere Hardware-Probleme klären.niemand hat geschrieben:ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft
Danach (oder mit denen ) melde ich mich wieder.
Grüße, Günther
Re: shellscript-Kontrolle
-c bedeutet count, übersetzt also Anzahl.guennid hat geschrieben:Den Parameter -c habe ich bisher nicht benutzt. Ich verstehe einfach nicht, was die (englische) manpage mir dazu zu sagen hat.
ping -c 5 Ziel
heißt, daß das Ziel 5 mal angepingt wird und sich das Programm dann beendet.
Re: shellscript-Kontrolle
Danke!
Das hier konnte ich mir nicht übersetzen:
Grüße, Günther
Das hier konnte ich mir nicht übersetzen:
Code: Alles auswählen
With deadline option, ping waits for count ECHO_REPLY packets, until the time‐out expires.
Re: shellscript-Kontrolle
Das mit der Deadline bezieht darauf, wenn man den Parameter -w zusätzlich verwendet. Mit -c 5 würde ping 5 mal anklopfen, mit zusätzlich -w 3 würde ping nach höchstens 3 Sekunden aussteigen, egal ob 5 mal angeklopft werden konnte oder nicht. Das ist dann quasi ein Netz mit doppeltem Boden.´guennid hat geschrieben: Das hier konnte ich mir nicht übersetzen:Code: Alles auswählen
With deadline option, ping waits for count ECHO_REPLY packets, until the time‐out expires.
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: shellscript-Kontrolle
Zum Thema ping und -i und -c und -w:
Manchmal möchte man einfach, dass der ping-check schnell erledigt ist, wobei man auch mehr als einen senden möchte, weil ein einzelner auch schon Mal verloren gehen kann.
Eine Möglichkeit ist, mehrere Anfragen in schneller Folge zu verschicken, wobei es als normaler Benutzer eine Minimalabstand gibt, damit man ping nicht missbrauchen kann.(Das Limit steht in der man-page).
Z. B.
Also 5 Anfragen mit 0,2 Sekunden Abstand mit einem Gesamttimeout von 2 Sekunden.
EDIT: Kommandozeile korrigiert
Manchmal möchte man einfach, dass der ping-check schnell erledigt ist, wobei man auch mehr als einen senden möchte, weil ein einzelner auch schon Mal verloren gehen kann.
Eine Möglichkeit ist, mehrere Anfragen in schneller Folge zu verschicken, wobei es als normaler Benutzer eine Minimalabstand gibt, damit man ping nicht missbrauchen kann.(Das Limit steht in der man-page).
Z. B.
Code: Alles auswählen
ping -i 0.2 -c 5 -w 2
Also 5 Anfragen mit 0,2 Sekunden Abstand mit einem Gesamttimeout von 2 Sekunden.
EDIT: Kommandozeile korrigiert
Zuletzt geändert von heisenberg am 11.02.2016 11:06:22, insgesamt 1-mal geändert.
Re: shellscript-Kontrolle
Du meinst so:heisenberg hat geschrieben:Also 5 Anfragen mit 0,2 Sekunden Abstand mit einem Gesamttimeout von 2 Sekunden.Code: Alles auswählen
ping -t 0.2 -c 5 -w 2
Code: Alles auswählen
ping -i 0.2 -c 5 -w 2
Re: shellscript-Kontrolle
Vielleicht magst du noch schreiben was das Ziel von dem Script ist. Es gibt nette Anwendungen wie nagios3 die das auch können. Was ist das andere Kommando das abgebrochen werden soll?
Re: shellscript-Kontrolle
@
Ich nehme mal an, die letzte Frage richtete sich nicht an mich.
nagios3 kannte ich nicht. Danke! Wenn ich meine Ideen so durchgehe, weiß ich aber nicht ob mir das was bringt, bzw. ich damit umzugehen vermag. Deswegen noch mal kurz mein "Problemchen", mehr ist es eigentlich nicht:
Ich habe zwei Subnetze. Die Rechner im zweiten Subnetz benutze ich meistens remote über einen Router, den ich aus dem ersten Netz nur über wlan erreiche. Die Verbindung bricht häufig ein, wenn ich sie nicht über einen Dauerping des Rechners im zweiten Netz auf einen Rechner im 1. Netz aufrechterhalte. Nun ist es manchmal nötig, dass ich mich direkt an einem solchen Rechner aus dem zweiten Netz setze, wozu ich ihn aber entweder ganz vom Netz trenne, zumindest aber vom Router zwischen den Subnetzen. Ein Dauerping an einen gar nicht erreichbaren Rechner würde in diesem Fall zumindest stören. Ergo war die Idee, den Ping (als Dauerping) erst dann zuzulassen, wenn ein vorgeschalteter Einzelping erfolgreich war. Ich denke mit heisenbergs script oben sollte ich weiterkommen. Aber das muss ich mir in ein Pascal-Programm schreiben. Shell-Syntax auf dieser Ebene ist nicht so gut für meinen Blutdruck.
Grüße, Günther
Ich nehme mal an, die letzte Frage richtete sich nicht an mich.
nagios3 kannte ich nicht. Danke! Wenn ich meine Ideen so durchgehe, weiß ich aber nicht ob mir das was bringt, bzw. ich damit umzugehen vermag. Deswegen noch mal kurz mein "Problemchen", mehr ist es eigentlich nicht:
Ich habe zwei Subnetze. Die Rechner im zweiten Subnetz benutze ich meistens remote über einen Router, den ich aus dem ersten Netz nur über wlan erreiche. Die Verbindung bricht häufig ein, wenn ich sie nicht über einen Dauerping des Rechners im zweiten Netz auf einen Rechner im 1. Netz aufrechterhalte. Nun ist es manchmal nötig, dass ich mich direkt an einem solchen Rechner aus dem zweiten Netz setze, wozu ich ihn aber entweder ganz vom Netz trenne, zumindest aber vom Router zwischen den Subnetzen. Ein Dauerping an einen gar nicht erreichbaren Rechner würde in diesem Fall zumindest stören. Ergo war die Idee, den Ping (als Dauerping) erst dann zuzulassen, wenn ein vorgeschalteter Einzelping erfolgreich war. Ich denke mit heisenbergs script oben sollte ich weiterkommen. Aber das muss ich mir in ein Pascal-Programm schreiben. Shell-Syntax auf dieser Ebene ist nicht so gut für meinen Blutdruck.
Grüße, Günther
- heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Re: shellscript-Kontrolle
Nagios fände ich dafür jetzt aber auch ganz schön overkill.
Aber ja: Nagios kann Server überwachen und Aktionen ausführen, wenn Checks fehlschlagen.
Im übrigen verwende ich da lieber noch OMD/check_mk als Aufsatz für Nagios. Das hat nach 1 Jahr Plain-Nagios doch sehr zu meiner Entspannung beigetragen.
Aber ja: Nagios kann Server überwachen und Aktionen ausführen, wenn Checks fehlschlagen.
Im übrigen verwende ich da lieber noch OMD/check_mk als Aufsatz für Nagios. Das hat nach 1 Jahr Plain-Nagios doch sehr zu meiner Entspannung beigetragen.
Re: shellscript-Kontrolle
Also ich würde versuchen das eigentliche Netzwerkproblem zu lösen. Vielleicht magst du mal deine Netzstruktur aufmalen. Ist der Router zwischen den beiden Netzen ein echter Router oder ein PC? Vielleicht liegt dort das Problem. Spontan würde ich den Router/Rechner durch einen TL-WR802N im WISP-Modus austauschen, sofern die Entferung nicht zu weit ist. Sowas habe ich für solche Zwecke immer rumliegen.
Re: shellscript-Kontrolle
Habe ich schon, vor etlichen Monaten. Und ja, sie ist ziemlich suboptimal. Aber leider nicht zu ändern. Am Zwischen-Router (PC, devuan) liegt's sicherlich nicht. Eine Vollverkabelung würde es wohl bringen, aber die käme hier einem mittleren Umzug/kleinerem Umbau gleich. Das Problem ist, das die vorher praktizierte Steckdosenlösung an einer Maschine im 1. Netz scheitert, die dann, wenn sie auch nur Kontakt zum Stromnetz hat, das LAN ziemlich komplett unbrauchbar macht. Und nein, schaltbare Steckdosenleiste hat auch nicht geholfen. Wir sollten das nicht weiter verfolgen. Soweit es mich betrifft, würde ich den Thread gerne ruhen lassen, bis ich bei Gelegenheit mit der Ping-Geschichte weiter bin.Vielleicht magst du mal deine Netzstruktur aufmalen.
Grüße, Günther