Acid88 Geschrieben 17. April 2009 Geschrieben 17. April 2009 (bearbeitet) Hi! also ersteinmal zum Sinn des ganzen. ich habe 2 Server und eine USV mit einem Seriellen Port. Mir sind leider letzte Woche meine UPS-tools abgeraucht und seitdem würde ein Server nichtmehr runter fahren. Da ich aber morgen weg muss wollte ich eben noch schnell ein kleines Script schrieben um einen der Server über einen Ping zum anderen runter zu fahre, Es gibt momentan 2 versionen, die wie folgt aussehen: Version 1: #!/bin/sh REBOOT="0" while true for d in a b c do sleep 30 if [ping -c1 192.168.151.29] /usr/bin/true echo überprüfe Ping then echo Ping erfolgreich REBOOT=/usr/bin/false break fi done if $REBOOT then sleep 30 exit 0 ich bekomme leider aber eine Fehlermeldung: ./test3: line 31: syntax error: unexpected end of file Das zweite sieht wie folgt aus: if $REBOOT="0" then init -0 else sleep 30 fi exit 0 Hier hätte ich nun: Syntax error near unexpected token `else` Es würde mich freuen wenn ihr mir hier weiter helfen könntet. Ps.: Mein Testcoimputer hat eine Suse 11.1 und der Server um den es geht eine Suse 10.2. Mit freundlichen Grüßen *Edit* In derm File /usr/bin/false steht: 64 bytes from 192.168.151.29: icmp_seq=* ttl=128 tim=*.** ms Bearbeitet 17. April 2009 von Acid88 Zitieren
keil Geschrieben 17. April 2009 Geschrieben 17. April 2009 Bei dem ersten Script fehlt das "fi" am Ende. Das Script selbst verstehe ich leider nicht wirklich Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 das fi hatte ich einmal drin, dann bekomme ich folgendes: syntax error near unexpected token `fi` Zitieren
keil Geschrieben 17. April 2009 Geschrieben 17. April 2009 Es fehlt auch noch ein "done" von der while-Schleife Und das "do" dort fehlt ebenfalls.. Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 Sauberes einrücken hilft... #!/bin/sh SLEEPTIME=1 CHECKIP=192.168.99.9 while true do sleep ${SLEEPTIME} # check ping /bin/ping -c1 ${CHECKIP} > /dev/null 2>&1 if [ $? -eq 0 ] then # ping success, exitcode = 0 # do something echo ping success else # ping exitcode != 0, failed # do something else echo ping fail fi done So als Grundlage... Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 Danke dir, werde es mal nachd einer Vorlage probieren. Ich muss ja auch ehrlich gestehen, dass das mein erstes Script ist Mit freundlichen Grüßen Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 sry for doublepost aber ändern geht nicht mehr. ein paar kurze Fragen: Was bedeutet der Ausdruck:[ $? -eq 0 ] bzw was muss ich mit dem tun? bzw was bewirkt der?? trage ich bei ${CHECKIP} die ip ein? Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 Das Script ruft ping auf (in einer subshell). Ping erreicht entweder die Maschine oder nicht. Wie jedes Kommando gibt ping einen exitcode zurück, wobei 0=alles okay. In Shellscripten kann man per $? auf den Exitcode des letzten Kommandos zurückgreifen. zum Ausdruck [ $? -eq 0 ] empfehle ich "man test" ${CHECKIP} ist einfach eine Variable, die oben im Script via CHECKIP=123.123.123.123 gesetzt wurde. Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 (bearbeitet) ok, ich bekomme jetzt endlich ausgaben ^^ aber 2 kleine Fragen habe ich jetzt noch: 1.) Wie kann ich nun eine Art Schleife einbauen? weil ich es gerne hätte wenn der Ping durchlauf vor dem Showdown 3-mal durchläuft. Weil ein einzelner Ping jeder Zeit mal schief gehen kann und ich nicht andauernd den Server neu starten will. Auf einem Solarisserver habe ich das mit dem Befehl for d in a b c gelöst. Aber wenn ich das hier tue passt die Syntax im ganzen Skript nicht mehr. Dann bekomme ich quasi für fast jede Zeile ne Fehlermeldung. Hier einmal das ganze Skript für einen Solarisserver: #!/bin/sh PING=`/usr/sbin/ping 192.168.XXX.XXX` COUNTER=0 LIMIT=0 sleep 15 for i in a b c do if [ "$PING" = "192.168.XXX.XXX is alive" ]; then COUNTER=`expr 1 + $COUNTER` fi done if [ $COUNTER = $LIMIT ] then echo Bereite shutdown vor shutdown -g 1 -y -i 5 fi 2.) Wenn ich in der Konsole die IP anpinge bekomme ich ein entsprechende Ausgabe das der Ping durch ging. Das Script jedoch gibt mir nur aus, das das Ziel nicht erreichbar ist. Zum Script selbst: Das Ziel ist es alle 30 Sekunden einen anderen Server an zu pingen, wenn diese down ist soll sich der Server auf dem das Skript läuft auch runter fahren. MFG Acid **edit** tut mir auch leid, dass ich euch hier über alles aufrage, aber ich gehe heute Abend in Urlaub und bis dahin muss das irgendwie laufen. Hätte ich mehr Zeit würde ich mich ja gerne wieter ins Thema einarbeiten um es dann zu tun. Bearbeitet 17. April 2009 von Acid88 Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 1.) Wie kann ich nun eine Art Schleife einbauen? weil ich es gerne hätte wenn der Ping durchlauf vor dem Showdown 3-mal durchläuft. Weil ein einzelner Ping jeder Zeit mal schief gehen kann und ich nicht andauernd den Server neu starten will. Auf einem Solarisserver habe ich das mit dem Befehl for d in a b c gelöst. Du brauchst dafür keine Schleife. Du zählst deinen Fehlercounter hoch und wann er das Limit erreicht hat erfährst du über einen Test. Pseudocode: while true do if (ping ok) then resette failcounter else zähle failcounter hoch if (failcounter zu hoch) then reboot fi fi sleep xyz done 2.) Wenn ich in der Konsole die IP anpinge bekomme ich ein entsprechende Ausgabe das der Ping durch ging. Das Script jedoch gibt mir nur aus, das das Ziel nicht erreichbar ist. Und die Frage hier ist wo? **edit** tut mir auch leid, dass ich euch hier über alles aufrage, aber ich gehe heute Abend in Urlaub und bis dahin muss das irgendwie laufen. Hätte ich mehr Zeit würde ich mich ja gerne wieter ins Thema einarbeiten um es dann zu tun. Dann nutz dies: #!/bin/sh # settings - interval, ip, maxfail, debugflag CHKINTERVAL=30 CHKIP=192.168.x.y MAXFAILS=3 FAILCOUNT=0 DEBUG=1 [ $DEBUG -eq 1 ] && echo Starting up.... # outer loop while true do [ $DEBUG -eq 1 ] && echo pinging $CHKIP # check ping /bin/ping -c1 ${CHKIP} > /dev/null 2>&1 if [ $? -eq 0 ] then # ping success, reset failcount [ $DEBUG -eq 1 ] && echo $CHKIP reachable FAILCOUNT=0 [ $DEBUG -eq 1 ] && echo sleeping $CHKINTERVAL seconds... sleep $CHKINTERVAL else # ping fail, increase failcount let FAILCOUNT=$FAILCOUNT+1 [ $DEBUG -eq 1 ] && echo increased failcount to $FAILCOUNT if [ $FAILCOUNT -ge $MAXFAILS ] then [ $DEBUG -eq 1 ] && echo failed $FAILCOUNT times in a row - shutting down! shutdown -g 1 -y -i 5 exit fi # ping failed, try again in 1 second sleep 1 fi done Bei DEBUG=0 hält das script brav den mund. CHKINTERVAL ist die Zeit die das Script schläft zwischen erfolgreichen pings. Unerfolgreiche Pings werden nach 1 Sekunde wiederholt (ggf. anpassen) Nach 3 konsekutiven Ping fails (hiergeprüft mit -ge - greater or equal) wird runterfgefahren. Numerische vergleiche macht man übrigens mit [ n -eq m ] (equal), "=" vergleicht Zeichenketten. Statt expr ist let imho schöner. HTH, schönen Urlaub Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 Hey, ich danke dir ^^ funktioniert uper und wird den Urlaub über halten bis ich mich dann wirklcih um das Problem selbst kümmern kann ^^. Ein frage aber noch, wieso tut mein nohup nicht? Ich gebe nohup ./shutdownskript > nohupout ein und bekomme als Dank des Programmes ein freundliches: nohup: ignoring input and redirecting stderr to stdout MFG Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 och das macht nohup immer. # nohup ./script.sh & nohup: ignoring input and appending output to `nohup.out' # ps -ef |grep script user 856 820 0 18:50 pts/1 00:00:00 /bin/sh ./script.sh /edit: & vergessen beim start? Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 (bearbeitet) ah ok ^^ fast hätte es geklappt: lamp:~ # nohup shutdown & [1] 23607 lamp:~ # nohup: ignoring input and appending output to `nohup.out' [1]+ Exit 1 nohup shutdown MFG wenn ich mit ps -A die Prozesse abrufe habe ich auhc weder shutdown noch nohup drin. Bearbeitet 17. April 2009 von Acid88 Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 Offensichtlich ist das script mit Code 1 beendet worden. Irgendwo ein exit 1 eingefügt? Wenn das Script ohne nohup klappt, sollte es auch mit nohup laufen. Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 (bearbeitet) nein, aber da ist aus deinem Skript noch das EXIT kurz hinter dem Then der If then else funktion wenn cih es einfach nur normal ausführe bekomme ich folgende Ausgabe: lamp:~ # ./shutdown Beginne mit dauerping.... pinging 192.168.151.31 192.168.151.31 reachable sleeping seconds... pinging 192.168.151.31 192.168.151.31 reachable sleeping seconds... MFG Bearbeitet 17. April 2009 von Acid88 Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 Das einzige exit im script ist hinter dem shutdown... und das liefert exitcode 0. Wenn das script dahin käme, wär der Rechner schon am runterfahren Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 (bearbeitet) richtig, das merkwürdige ist, wenn cih es njormal ausführe bekomme ich folgende Ausgabe: lamp:~ # ./shutdown Beginne mit dauerping.... pinging 192.168.151.31 192.168.151.31 reachable sleeping seconds... pinging 192.168.151.31 192.168.151.31 reachable sleeping seconds... :(**ich mag endlich Urlaub ** :( **huel**:( Bearbeitet 17. April 2009 von Acid88 Zitieren
DevilDawn Geschrieben 17. April 2009 Geschrieben 17. April 2009 (bearbeitet) richtig, das merkwürdige ist, wenn cih es njormal ausführe bekomme ich folgende Ausgabe: 192.168.151.31 reachable sleeping seconds... Keine Zahl zwischen sleeping und seconds? Da sollte der Wert von $CHKINTERVAL stehen. # ./script.sh Starting up.... pinging 192.168.69.1 192.168.69.1 reachable sleeping 30 seconds... /edit: Tipp: Debugmode nutzen. "nohup sh -x ./scriptname.sh &" und dann nohup.out ansehen was schiefläuft... Bearbeitet 17. April 2009 von DevilDawn Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 (bearbeitet) Hier die entsprechende Zeile: [ $DEBUG -eq 1 ] && echo sleeping $CHKINTERVAL seconds... Stimmt ^^ und genau das war es, augenscheinlich zumindest ^^ ich werde es in 15 min nocheinmal überprüfen, aber cih danke dir für deine Hilfe. Du bist genial ^^ MFG **Edit** es funktioniert perfekt, ich danke dir noch einmal** Bearbeitet 17. April 2009 von Acid88 Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 Ich korrigiere, es funktionierte etwa 10 minuten... selber Fehler: hier nocheinmal das Skript: lamp:~ # vi shutdown #!/bin/sh # CHKIP=192.168.151.31 MAXFAILS=3 FAILCOUNT=0 DEBUG=1 CHKINTERVAL=90 [ $DEBUG -eq 1 ] && echo Beginne mit dauerping.... # eeusserer loop while true do [ $DEBUG -eq 1 ] && echo pinging $CHKIP # ping /bin/ping -c1 ${CHKIP} > /dev/null 2>&1 if [ $? -eq 0 ] then # Ping durch, Failcount wird auf 0 zurueckgesetzt [ $DEBUG -eq 1 ] && echo $CHKIP reachable FAILCOUNT=0 [ $DEBUG -eq 1 ] && echo sleeping $CHKINTERVAL seconds... sleep 90 else # Ping fehlgeschlagen, Failcount +1 let FAILCOUNT=$FAILCOUNT+1 [ $DEBUG -eq 1 ] && echo increased failcount to $FAILCOUNT if [ $FAILCOUNT -ge $MAXFAILS ] then [ $DEBUG -eq 1 ] && echo failed $FAILCOUNT times in a row - shutting down! shutdown -g 0 -y -i 5 exit fi # Der Vorgang wird in einer Skund wiederholt sleep 1 fi done hier die nohupzeile: lamp:~ # nohup shutdown & [1] 23922 lamp:~ # nohup: ignoring input and appending output to `nohup.out' [1]+ Exit 1 nohup shutdown woran kann es denn jetzt noch liegen? Zitieren
Acid88 Geschrieben 17. April 2009 Autor Geschrieben 17. April 2009 my foult ^^ habe es hinbekommen, hatte nur das ./ im nohupbefehl vergessen, ich idiot ^^ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.