donniduck
Goto Top

Linux-Server soll automatisch herunterfahren!

Der Linux-Server (Ubuntu-6.06) soll sich automatisch ausschalten, wenn keine Clients mehr im Netz sind, wie kann man dies lösen?

Hallo,

ich möchte gerne einen Linux-Server (Ubuntu-6.06) automatisch herunterfahren. Dieser sollte aller 5 Minuten nachsehen ob noch Clientrechner im Netzwerk vorhanden sind. Sollte noch ein Client aktiv sein, dann wird die Routine einfach abgebrochen.

Ist kein Client mehr im Netz, dann soll der Server sich nach einer Minute ausschalten (Textmeldung ausgeben, Piepston am Server soll erzeugt werden).

1.
Kann die Textmeldung nur am Linux-Server ausgegeben werden oder auch an den Windows-Clients?

2.
Der Server soll natürlich bestimmte "Clients" ignorieren, wie z.B. den Router und den Netzwerkdrucker!

3.
Vor dem Herunterfahren soll der Server noch ein bestimmtes Verzeichnis löschen, wie kann man dies mit einbinden (rm –f /home/transfer)?

4.
Kurz vor dem Herunterfahren (z.B. 20 Sekunden) soll der Server eine Warnmeldung an den Summer ausgeben (regelmäßiges Piepsen)!

5.
Ich habe mich im Internet schon einmal umgesehen und habe herausgefunden, dass man dies mit der Sprache Shell lösen kann. Da ich mich mit dieser Thematik noch nicht sehr stark befasst habe, wäre es schön wenn ihr mir ein paar Tipps bzw. Lösungsansätze geben könnt!

Gruß Donni Duck!

Content-ID: 43744

Url: https://administrator.de/contentid/43744

Ausgedruckt am: 05.11.2024 um 23:11 Uhr

6890
6890 06.11.2006 um 17:03:34 Uhr
Goto Top
hallo,

ja das kann man mit einem shell script lösen.
ich würde es so machen:

#!/bin/bash

#datei wo die ips der clients drinne sind
CLIENTS=`grep /DATEI/DER/CLIENTS`

#verzeichnis was gelöscht werden soll
DELETE=/home/transfer

for i in $CLIENTS
do
      ping -c 4 $i
      if test $? -eq 0
      then
             echo "$i ist erreichbar"  
      else
             rm -rf $DELETE
             echo "Der Server wird heruntergefahren..."  
             sleep(20)
             init 0
             exit
      fi
done

das mit dem piepsen weis ich leider ni, und das script würde ich vorher auch testen (is jetzt so auf die schnelle geschrieben)

mfg godlike P
DonniDuck
DonniDuck 06.11.2006 um 18:22:22 Uhr
Goto Top
Super,

das hilft mir erst einmal weiter!

Einige Fragen noch:

1.
Die Datei, wo die Clients eingetragen sind, kann mit einem normalen Editor erstellt werden (vi, nano)?

2.
Wie sollte diese Datei aufgebaut sein:

192.168.115.1;192.168.115.2;192.168.115.3 usw.

3.
Wenn ich dies richtig interpretiere ist i eine Variable und steht für die IP-Adressen der Clients, mit welcher Routine bzw. Befehl werden die einzelnen IP´s angesprochen?

4.
Gibt es eine Art Zähler oder eine Konstante, denn der Befehl Ping muss ja z.B. 3 x (für 3 Clients) durchgeführt werden!

5.
Könntest du die wichtigen Zeilen kurz kommentieren (Einsteiger in Shell)?

Danke und Gruß Donni!
6890
6890 07.11.2006 um 17:30:55 Uhr
Goto Top
1.
Die Datei, wo die Clients eingetragen sind,
kann mit einem normalen Editor erstellt
werden (vi, nano)?
ja
2.
Wie sollte diese Datei aufgebaut sein:

192.168.115.1;192.168.115.2;192.168.115.3
usw.
nein eher so ohne leerzeilen etc, einfach nacheinander pro zeile 1 ip):
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
usw

3.
Wenn ich dies richtig interpretiere ist i
eine Variable und steht für die
IP-Adressen der Clients, mit welcher Routine
bzw. Befehl werden die einzelnen IP´s
angesprochen?
for i in $CLIENTS bedeutet gehe jede ip in $CLIENTS durch und setze sie in i ein
4.
Gibt es eine Art Zähler oder eine
Konstante, denn der Befehl Ping muss ja z.B.
3 x (für 3 Clients) durchgeführt
werden!
keine ahnung was du meinst face-smile
5.
Könntest du die wichtigen Zeilen kurz
kommentieren (Einsteiger in Shell)?
ja könnt ich
#!/bin/bash 
#datei wo die ips der clients drinne sind
CLIENTS=`grep /DATEI/DER/CLIENTS`

#verzeichnis was gelöscht werden soll
DELETE=/home/transfer

#gehe alle ips durch und setze sie in i ein
for i in $CLIENTS
do
      #ping die ip die in $i steht an
      ping -c 4 $i
      #wenn es erfolgreich war
      if test $? -eq 0
      then
             #gebe das aus
             echo "$i ist erreichbar"  
      #ansonsten
      else
             #lösche das transfer verzeichnis
             rm -rf $DELETE
             #gebe das aus
             echo "Der Server wird heruntergefahren..."  
             #warte 20 sekunden
             sleep(20)
             #fahre den server herunter
             init 0
             #beende das script
             exit
      fi
done
Danke und Gruß Donni!
bitte
mfg godlike P
DonniDuck
DonniDuck 08.11.2006 um 16:39:48 Uhr
Goto Top
Ich habe jetzt mal deine Shell-Routine ausprobiert:

#!/bin/bash

#Datei wo die IPs der Clients hinterlegt sind
CLIENTS="grep /etc/skripte/auto-shutdown-ips.dat"  

for i in $CLIENTS
do
        ping -c 4 $i
        if test $? -eq 0
        then
                echo "$i ist erreichbar!"  
        else
                echo "Der Server wird in 20 Sekunden heruntergefahren..."  
                sleep 20
                init 0
                exit
        fi
done

Folgende Änderung habe ich noch vorgenommen:

1.
sleep 20 statt sleep (20)...durch den Befehl
sh -n /etc/skripte/auto-shutdown.sh
war ein Fehler angezeigt

Das Problem:

Der Server fährt wunderbar herunter, aber leider auch immer, wenn ich den Testbefehl ausführe:

sh -x /etc/skripte/auto-shutdown.sh

Ich bekomme nur die Fehlermeldung:


ping: unknown host grep


Also wird der Ping-Test nicht durchgeführt bzw. er kann sich die Daten nicht aus der /etc/skripte/auto-shutdown-ips.dat holen!

In dieser Datei steht aber nur:

192.168.115.32

Wenn ich den Rechner ganz normal anpinge geht es! Was ist das Problem?

Gruß Donni!
6890
6890 08.11.2006 um 16:45:14 Uhr
Goto Top
Ich habe jetzt mal deine Shell-Routine
ausprobiert:


#!/bin/bash
#Datei wo die IPs der Clients hinterlegt
sind
CLIENTS="grep
/etc/skripte/auto-shutdown-ips.dat"

ja weil das "" falsch ist !!! deswegen bekommt er keine ips!!
da müssen anstatt hochkommas sogenannte backticks (shift + das zeichen rechts von ß) hin.
denn dann interpretiert die shell das als kommando und führt grep blabla aus und schreibt das ergebnis in die variable!!!

mfg godlike P
DonniDuck
DonniDuck 08.11.2006 um 17:06:32 Uhr
Goto Top
So habe jetzt mal die Änderung vorgenommen, leider zeigt er aber nur folgendes an:

grep /etc/skripte/auto-shutdown-ips.dat

Nichts passiert und nach etwa 5 Minuten wird die Routine abgebrochen bzw. manueller Benutzerabbruch!
6890
6890 08.11.2006 um 17:23:16 Uhr
Goto Top
ahh sorry ich bin bescheuert da muss natürlich cat statt grep hin face-wink

also CLIENTS=`cat /etc/skripte/auto-shutdown-ips.dat`

sorry sorry sorry

mfg
DonniDuck
DonniDuck 08.11.2006 um 17:48:58 Uhr
Goto Top
Jetzt wird es aber langsam richtig spannend!

Also der Befehl funktioniert.... ABER:

wenn z.B. ein Rechner an und einer aus ist, wird trotzdem der Rechner heruntergefahren, müsste man nicht irgendwie alle IPs logisch und verknüpfen?
6890
6890 08.11.2006 um 18:23:17 Uhr
Goto Top
ahso hmmja eigentlich schon
dann halt so:
#!/bin/bash 
#Datei wo die IPs der Clients hinterlegt sind
CLIENTS=`grep /etc/skripte/auto-shutdown-ips.dat`

for i in $CLIENTS
do
        ping -c 4 $i
        if test $? -eq 0
        then
                a=1
        fi
done

if test $a -ne 1
then
       echo "Der Server wird in 20 Sekunden heruntergefahren..."  
       sleep 20
       init 0
       exit
fi
d.h. wenn einer erreichbar ist wird a auf 1 gesetzt und das script läuft normal durch und wenn a nicht gleich 1 ist, also keiner an ist, fährt derserver runter face-smile
mfg
DonniDuck
DonniDuck 08.11.2006 um 18:42:54 Uhr
Goto Top
Ich habe mal etwas gegoogelt:

Also:

$? steht doch für:

"gibt den Return-Code des zuletzt ausgeführten Kommandos an (0 bei erfolgreicher Ausführung)"

für was steht denn -eq 0 (...wenn gleich Null)??

Wenn also der Ping z.B. 5 mal ausgeführt wird, sind dies doch 5 einzelne Kommandos, die Folge ist doch, dass nur der letzte Ping hier ausgewertet wird.... oder???

Deshalb meine Frage zum Anfang mit einem Puffer (Stack)!
6890
6890 08.11.2006 um 18:54:53 Uhr
Goto Top
nee das is doch ne schleife (for) deswegen wird jeder ping ausgewertet!!

mfg
DonniDuck
DonniDuck 08.11.2006 um 19:21:27 Uhr
Goto Top
Ich habe es jetzt mal mit 4 Rechnern getestet:

Alles läuft nur bei der Option "Alle aus" (Server soll sich ausschalten) kommt folgende Meldung:

+ test 1 -eq 0
+ test -ne 1
/etc/skripte/auto-shutdown.sh: line 16: test: -ne: unary operator expected

Was ist jetzt los?

Danke für deine Unterstützung!!!
DonniDuck
DonniDuck 08.11.2006 um 19:36:07 Uhr
Goto Top
Hier noch einmal das aktuelle Skript:

#!/bin/bash
#Datei wo die IPs der Clients hinterlegt sind
CLIENTS=`cat /etc/skripte/auto-shutdown-ips.dat`

for i in $CLIENTS
do
        ping -c 4 $i
        if test $? -eq 0
        then
                a=1
                echo "$i ist erreichbar!"  
        fi
done

if test $a -ne 1
then
        echo "Der Server wird in 20 Sekunden heruntergefahren..."  
        sleep 20
        init 0
        exit
fi
6890
6890 08.11.2006 um 20:05:29 Uhr
Goto Top
probiers mal so:

#!/bin/bash #Datei wo die IPs der Clients hinterlegt sind
CLIENTS=`cat /etc/skripte/auto-shutdown-ips.dat`
a=0

for i in $CLIENTS
do
        ping -c 4 $i
        if test $? -eq 0
        then
                a=1
                echo "$i ist erreichbar!"  
        fi
done

if test $a -ne 1
then
        echo "Der Server wird in 20 Sekunden heruntergefahren..."  
        sleep 20
        init 0
        exit
fi
DonniDuck
DonniDuck 09.11.2006 um 09:31:43 Uhr
Goto Top
Hurra es funktioniert!

Super gemacht godlike P! face-smile

Noch eine kleine Zusatzaufgabe....Während der Wartezeit soll der Benutzer die Möglichkeit haben den Vorgang abzubrechen!

Wie kann man dies lösen? Die Tastatur muss ja abgefragt werden!

Meine Vorstellung:

if test $a -ne 1
then
        echo "Der Server wird in 20 Sekunden heruntergefahren..."  
        sleep 20
        echo ".... Möchten Sie den Autoshutdown abbrechen, dann betätigen Sie die Taste "e"!!!"    
                      if test "Taste e gedrückt -eq 0"  
                      then
                      echo "Abbruch des Auto-Shutdowns durch Benutzer $Benutzername"  
                      exit
                     fi
        init 0
        exit
fi

Gruß in meine Heimat
Donni Duck
DanielSGE
DanielSGE 07.05.2008 um 14:36:05 Uhr
Goto Top
Hallo! Nach solch einen Skript hab ich auch schon seit Tagen Ausschau gehalten. Wäre es aber möglich noch etwas einzubauen?

Gut wäre es nämlich wenn dieses Überprüfung noch ein weiteres Mal durchgeführt würde. Also nicht, dass der eine Rechner, der verbunden ist, gerade rebootet und plötzlich ist der Server aus.

Wäre für ein bisschen Hilfe sehr dankbar;)

Gruß

Daniel