Mehrere Aufgaben in einem Shell Skript

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Abend zusammen,

    ich habe mir hier ein kleines Skript zusammen gefasst, welches per PING im Netzwerk Schaut ob alles Ok ist, wenn nicht dann sendet es eine Push (prowl) nachricht an mich.

    Ich habe es leider bis jetzt nur geschafft das das Skript eine Anfrage durchführt, habe das Skript mal hier:

    Wenn ich das Skript starte macht der den Ping bei IP_1 und beendet danach das Skript, leider kenne ich den befehl nicht (und habe es auch beim Googlen nicht gefunden, weder & noch && haben mich weiter gebracht) das das Skript nicht nach der ersten Abfrage beendet sondern zur nächsten Abfrage weiter geht. Es sollen dann insgesamt 13 Abfragen mit dem Code

    Code
    while true
    do
      if ! ping -q -c 1 ${IP_x}
      then
       /home/pi/prowl.sh "Netzwerk" 0 "${STANDORT_x}" "Verbindung ${NAME_x}-${IP_x} nicht möglich. $(date)"
      fi
    exit
    done


    gemacht werden.

    Kann mir vielleicht jemand helfen? Wahrscheinlich für die Profis hier nur ein kleiner "eingriff" :daumendreh2:

    Einmal editiert, zuletzt von Fillip13 (12. Dezember 2014 um 20:28)

  • Scripts werden von oben nach unten abgearbeitet. Ist da ein Befehl wird dieser ausgeführt und gewartet bis der beendet wurde, der weitere Ablauf wird dann also blockiert.

    Was willst du mit dem exit in jeder Schleife bewirken?


    Denk mal drüber nach was das exit bewirkt :fies:
    Also mal davon abgesehen das eine while-Schleife überflüssig is, welche du beenden willst, wäre exit der falsche Weg die while zu beenden.....


    PS: Ich würde das Script anders schreiben und nur eine "if Schleife" verwenden, aber dazu ggf später mehr ;)

  • Oh ha, jetzt hast du mich am falschen ende getroffen :D Ich habe mir das Skript irgendwo im Internet abgeguckt, wenn ich das exit entferne,

    Flippt er total aus und arbeitet im millisekunden takt nur das obere unendlich mal und ohne Ende Ab

    Einmal editiert, zuletzt von Fillip13 (12. Dezember 2014 um 20:37)

  • Naja die while Schleife dreht sich so lange im Kreis bis dessen Bedingung nicht mehr zutrifft. Da die Bedingung aber einfach nur True ist, was sich nicht verändert, dreht sich diese für immer und ewig im Kreis :D

    Das exit beendet das gesamte Script. Also muss da nachgebessert werden.

    Änder die while Schleife so ab dass eine Variable geprüft wird. Also zum Beispiel:


    Allgemeines Problem is allerdings das er sich bei der ersten while Schleife ewig aufhält und die nachfolgenden nicht ausgeführt werden...


    Desweiteren würde ich aber wie gesagt mit einer Anweisung/Funktion arbeiten um nicht 20x den selben Code immer wieder zu wiederholen.
    Auch die Liste könnte man in ein Array setzen..

    PS: Scripts werden Zeilenweise von oben nach unten abgearbeitet. Geh das mal gedanklich durch was da passiert, dann verstehst dus auch besser :)

  • Leider bin ich in dem Gebiet auch noch realtiv "neu/unerfahren" bis jetzt konnte ich mir immer so das nötigste zusammen stellen.
    Ändere ich nun das Skript um wie du es geschrieben hast bekomme ich folgende Meldung:

    Code
    ./networkcheck.sh: 65: [: 1: unexpected operator
    ./networkcheck.sh: 75: [: 1: unexpected operator

    Das von oben nach unten macht sinn und wenn ich das so durch gehe ist für mich das "done bzw exit" der Puntk an der Stelle das Skript halt zu beenden und nicht mehr weiter zu machen.

  • Hallo,

    ich sehe das so, dass du nur 13 mal die gleiche if-Anweisung ausführen willst, aber immer mit anderen Adressen.
    Würde das mit einer for-Schleife machen

    Code
    #13 mal, a nach jeder Runde um 1 erhoehen
    for ((a=1; a<=13; a++))
    do
            #Pruefung
            if ! ping -q -c 1 ${IP_$a}
            then
                    /home/pi/prowl.sh "Netzwerk" 0 "${STANDORT_$a}" "Verbindung ${NAME_$a}-${IP_$a} nicht möglich. $(date)"
            fi
    done


    <- ungetestet

  • Hi Julian, Ja genau das ist richtig, es ist jedesmal die selbe Anweisung nur mit einer anderen IP Adresse, Das Skript an sich funtkioniert ja, nur die abfrage bzw das weite abfragen der nachfolgenden Skripte nicht so wie ich das möchte, das mit "deinem" a" verstehe ich nicht ganz. Ich habe die Definitionen (IP Adresse und Co) ja schon definiert. Dein Skript wollte ich gerade mal "auf die schnelle testen" schlug aber fehl:
    Syntax error: Bad for loop variable


    Oder sollte a=1, b=2, c=3 und so weiter lauten?

  • Dann bin ich für Arrays. Versuch mal das:

    Achtung: Die Variablendeklarationen am Anfang sind in meinem Beispiel auch verändert. Das a ist nur ein Platzhalter für die Zahl nach der IP, bzw des Namens und des Standortes. D.h im ersten Durchlauf der for-Schleife ist a=1. Die IP IP$a, also IP1 wird geprüft. Im nächsten Durchlauf wird a=2 usw.

  • Ich würde das eher flexibler machen also gerade die for-Schleife, sodass die nicht auf 13 begrenzt ist. Denn sonst muss man die for-Schleife jedesmal anpassen wenn man dem Array was weg oder dazu nimmt ;)

    Spoiler anzeigen

    Problem hierbei ist aber auch noch dass das Script beendet wird sobald ein mal alle Arrays durchgepingt wurden. Lösung hierfür wäre die for-Schleife in eine while-Schleife zu legen:

    Spoiler anzeigen

    Soweit so gut...

    Problem hiermit ist jetzt aber das die for-Schleife wieder von Vorne anfängt auch wenn ein Ziel nicht gepingt werden konnte... Du wirst dann also von prowl zugespammt..
    Hierfür gäbe es soweit ich weiß nur 2 Möglichkeiten:
    - Den jeweiligen Array Eintrag zu löschen. Dann würde dieser Eintrag aber nie wieder gepingt werden können es sei dann man startet das Script neu...
    - Den jeweiligen Array Eintrag zu löschen und den Eintrag in ein tenporäres Array verschieben, welches zB erst wieder beim 5x durchlaufen der for-Schleife erneut zu prüfen..


  • Hierfür gäbe es soweit ich weiß nur 2 Möglichkeiten

    Oder einfach nicht ununterbrochen pingen, sondern nach jeder Schleife 10 Minuten warten. Dann gibts alle 10 Minuten ein prowl bis das Problem behoben wurde. Nachteil ist dann jedoch, dass du es eventuell erst nach <=10 Minuten mitbekommst, wenn ein Gerät offline geht.

    Spoiler anzeigen
  • Tell: Du bist etwas spät, der Part wurde bereits gelöst und das auch noch etwas eleganter :fies:

    Aber das zeigt das es immer mehr als nur einen Weg gibt :geek:

  • Damit kann man aber nicht Gezielte Nachricht verschicken von wegen "Das Gerät XYZ ist nicht erreichbar" :fies:

    Wie willste also mit dem Befehl nun genau das prüfen und ausführen was der TE möchte :huh:

  • Aber hallo ...


    Damit kann man aber nicht Gezielte Nachricht verschicken von wegen "Das Gerät XYZ ist nicht erreichbar" :fies:


    Du bekommst nur die zurück, die "up" ... also online sind ... und das in einem Rutsch und ohne Schleife für einen ganzen range ... was willste mehr?
    (ich weiss, ist schon spät ... trotzdem macht es Sinn, sich den output mal anzuschauen ;) ...)
    cu,
    -ds-

  • Es ist spät, indeed :D

    Der TE möchte nur eine Nachricht über die, die offline sind ;)

    Und er hat auch nicht 255 Netzwerkgeräte sondern nur 13.

    Ich denke es wäre wesentlich mehr Aufwand mithilfe des Befehls das zu erreichen was wir eigentlich schon fast gelöst haben

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!