shellscript-Kontrolle

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
guennid

shellscript-Kontrolle

Beitrag von guennid » 31.01.2016 10:53:05

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

DeletedUserReAsG

Re: shellscript-Kontrolle

Beitrag von DeletedUserReAsG » 31.01.2016 11:17:46

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.

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 31.01.2016 11:30:50

niemand hat geschrieben:Das Problem ansonsten wird sein, dass ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft.
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:ps? pidof? lsof?
Werde ich mir anschauen. Danke!

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

Re: shellscript-Kontrolle

Beitrag von heisenberg » 31.01.2016 11:36:48

Schreib' Doch nochmal genauer, was Du tun willst. Was wird im Normalfall ausgeführt, was dann abgebrochen werden soll?

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: shellscript-Kontrolle

Beitrag von MSfree » 31.01.2016 11:44:59

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?
ping loggt nichts, das schreibt nur auf Standard-Out und Standard-Error.

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
Das würde alle 60 Sekunden ein Ping ausführen und wenn der Rechner nicht erreichbar ist, eine Meldung ins Syslog mit dem Befehl "logger" schreiben.

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 31.01.2016 11:49:16

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.) :wink:

Grüße, Günther

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

Re: shellscript-Kontrolle

Beitrag von heisenberg » 31.01.2016 12:22:44

...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
Das kann man auch direkt in das zu überwachende Script einbauen:

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

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 05.02.2016 09:34:35

@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:

Code: Alles auswählen

ping -i 5 [Rechner/IP] > /dev/null 2>&1 &
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:
niemand hat geschrieben:ein Dauerping auch bei Unerreichbarkeit des Ziels weiterläuft
Aber bevor ich mich diesem ping wieder zuwende, muss ich auf dieser Maschine zunächst noch andere Hardware-Probleme klären.

Danach (oder mit denen :wink: ) melde ich mich wieder.

Grüße, Günther

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: shellscript-Kontrolle

Beitrag von MSfree » 05.02.2016 09:41:21

guennid hat geschrieben:Den Parameter -c habe ich bisher nicht benutzt. Ich verstehe einfach nicht, was die (englische) manpage mir dazu zu sagen hat.
-c bedeutet count, übersetzt also Anzahl.

ping -c 5 Ziel

heißt, daß das Ziel 5 mal angepingt wird und sich das Programm dann beendet.

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 05.02.2016 09:46:41

Danke!
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.
Grüße, Günther

Benutzeravatar
MSfree
Beiträge: 11605
Registriert: 25.09.2007 19:59:30

Re: shellscript-Kontrolle

Beitrag von MSfree » 05.02.2016 09:55:17

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.
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

Re: shellscript-Kontrolle

Beitrag von guennid » 05.02.2016 10:10:13

:THX:
Aha!

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

Re: shellscript-Kontrolle

Beitrag von heisenberg » 05.02.2016 10:39:19

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.

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.

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: shellscript-Kontrolle

Beitrag von tomi89 » 11.02.2016 01:57:08

heisenberg hat geschrieben:

Code: Alles auswählen

ping -t 0.2 -c 5 -w 2
Also 5 Anfragen mit 0,2 Sekunden Abstand mit einem Gesamttimeout von 2 Sekunden.
Du meinst so:

Code: Alles auswählen

ping -i 0.2 -c 5 -w 2

uname
Beiträge: 12398
Registriert: 03.06.2008 09:33:02

Re: shellscript-Kontrolle

Beitrag von uname » 11.02.2016 10:45:36

Vielleicht magst du noch schreiben was das Ziel von dem Script ist. Es gibt nette Anwendungen wie Debiannagios3 die das auch können. Was ist das andere Kommando das abgebrochen werden soll?

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 11.02.2016 11:31:52

@
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. :wink:

Grüße, Günther

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

Re: shellscript-Kontrolle

Beitrag von heisenberg » 11.02.2016 11:40:28

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. :)

uname
Beiträge: 12398
Registriert: 03.06.2008 09:33:02

Re: shellscript-Kontrolle

Beitrag von uname » 11.02.2016 13:02:41

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.

guennid

Re: shellscript-Kontrolle

Beitrag von guennid » 11.02.2016 14:30:01

Vielleicht magst du mal deine Netzstruktur aufmalen.
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.

Grüße, Günther

Antworten