Zum Inhalt springen

Bashscript für Shutdown eines Servers


Acid88

Empfohlene Beiträge

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey, ich danke dir ^^

funktioniert uper :D 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von DevilDawn
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Acid88
Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...