Linux Skript für automatischen Shutdown

PrincePaul

Software-Overclocker(in)
Linux Skript für automatischen Shutdown

Hallo Leute,

evtl. haben es schon einige von euch mitbekommen
aber ich baue momentan ein Gehäuse für ein NAS mit FreeNas als OS
welches ja auf Linux basiert....

SOoo nun zum Problem:

ich möchte das mein NAS die Rechner bzw. TV´s im Netzwerk anpingt um festzustellen wann das NAS nichtmehr benötigt wird und dann letztendlich automatisch runterfährt
evtl habt ihr ja noch andere Ideen wie man das realisieren kann
wichtig ist nur das es nachdem alle im Netzwerk offline gegangen sind das NAS runterfährt.

Naja ich hab mir da mal folgende 2 Skripte rausgesucht:

Skript 1:

Code:
#!/bin/bash

_exit () {
case $1 in
1) echo "Kein Shutdown - Mindestens einer der PCs ist eingeschaltet" ;;
2) echo "Kein PC online - Shutdown in 60 Sekunden" ; shutdown -p +1 ;;
esac
exit $1;
}

# Checken ob PC1 oder PC2 oder TV1 oder TV2 an ist
# .31 PrincePaul-PC .22 Unser-PC-1 .21 TV .25 TV2
if [ `ping -c 5 -i 1 192.168.178.31 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.22 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.21 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.25 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi

# Wenn kein PC an ist 3 mins warten falls gerade einer Neu startet
echo "Kein PC online - Warte 180 Sekunden"
sleep 180

# PCs nochmals checken
# Checken ob PC1 oder PC2 oder TV1 oder TV2 an ist
if [ `ping -c 5 -i 1 192.168.178.31 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.22 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.21 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi
if [ `ping -c 5 -i 1 192.168.178.25 | grep -wc 100.0%` -eq 0 ] ; then _exit 1 ; fi


# Falls keiner der PCs online war herunterfahren
_exit 2



Skript 2:

Code:
#!/bin/bash

HOST1=192.168.178.31 #PC
HOST2=192.168.178.22 #PC2
HOST3=192.168.178.21 #TV
HOST4=192.168.178.25 #TV2
HOST5=192.168.178.23 #Laptop

_exit () {
case $1 in
1) echo "Kein Shutdown - Mindestens einer der PCs ist eingeschaltet" ;;
2) echo "Kein PC online - Shutdown" ; shutdown -p now ;;
esac
exit $1;
}

# Checken ob PC's an sind
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;
# Wenn kein PC an ist, gehe zu Checken ob PC's im IP-Bereich an sind
else

# Checken ob PC's im IP-Bereich an sind
ip=192.168.178. #Netzadresse des eigenen Netzwerkes ohne den Hostanteil
i=21 #checke Netz ab Hostanteil 21
while [ $i -le 35 ] #checke Netz bis Hostanteil 35
do
ping -c 1 -i 1 $ip$i #ping mit der zusammengesetzten IP-Adresse aus den o.a. Variablen "ip" und "i"
if [ `ping -c 1 -i 1 $ip$i | grep -wc 100.0%` -eq 0 ] #sobald einer der Hosts auf den ping antwortet, nicht herunterfahren
then _exit 1 #beenden mit exit 1 (kein shutdown)
fi
i=$(( $i+1 )) #erhöhe Hostanteil immer um 1
done

_exit 2 # hat kein PC geantwortet, shutdown
fi


Fehler:

Skript 1 4: Syntax error: expecting "in"
Skript 2 7: Syntax error: expecting "in"

Die Rechte der Dateien sind auf 755 und um die Datei zu erstellen hab ich PSPad genutzt bzw. Text Editor von Windows und dannach einfach die Endung von txt auf sh geändert
ging aber beides nicht


hoffe jemand kann mir helfen
Gruß
Paule
 
Zuletzt bearbeitet:
AW: Linux Skript für automatischen Shutdown

Quote mal den Parameter in der Case-Anweisung der _exit-Funktionen:
Code:
case [B][COLOR=red]"[/B]$1[COLOR=red][B]"[/B] in
Ansonsten am Anfang der Scripts mal eine Zeile mit set -x einfügen, dann lässt sich der Ablauf besser tracen.
Btw. würde ich nicht mit grep arbeiten sondern mit dem Rückgabewert von ping. Ein Paket reicht eigentlich auch zum Test der Verbindung und der Ping-Befehl erlaubt auch, die Größe der Pakete zu reduzieren.
 
Alles klar werde das mal ausprobieren,
aber du musst wissen ich hab davon gar kein plan :-D

Also bis zum Set -x hab ich noch alles verstanden aber was meinst du mit nicht mit grep sondern der Ping Antwort arbeiten bzw.

Wie sieht das dann im Skript aus ... ich hab kein plan :-D

Bei der Paket Größe kann man ja dann das kleinste nehmen schont ja dann die Leitung.

Währe nett wenn du dir eins der beiden Skripte nimmst und das mal so änderst wie du das für richtig hältst ;)
 
AW: Linux Skript für automatischen Shutdown

Hi, habe bei mir so ziemlich die selbe Funktion - allerdings über einen Cronjob - eingerichtet.

Da du ja auch hier nur eine Rückmeldung brauchst ob ein Gerät (PC, TV) läuft denk ich funktioniert das ganze mit "fping" wesentlich unkomplizierter.

Hier mal mein Bashscript zum Suspend meines Servers:

#!/bin/bash

if fping 192.168.2.105 192.168.2.106 | grep -i alive
then echo einer_is_aktiv
else /usr/sbin/pm-suspend
fi


Die beiden IP-Adressen werden abgefragt, fping liefert im Falle dessen dass einer läuft ein "alive" zurück was ich mit grep abfange. Zusätzlich könntest du dir eine Schleife einbauen falls du wie in deinem Script das sleep weiter nutzen willst. In meinem Fall wird das Script per cron alle 30 min ausgeführt. Auf einem anderen Linuxsystem habe ich noch ein Script zum aufwecken des Servers das nach dem selben Prinzip funktioniert...

MfG
 
AW: Linux Skript für automatischen Shutdown

Sooo hab mir mal ein fertiges skript schon als sh Datei schicken lassen, dann per PSPad meine Ip´s eingetragen und es ging.

Keine Ahnung woran das lag.

Aber es wäre trotzdem noch gut wenn man die Paketgröße minimieren kann weils doch schon lange dauert bis er die ganzen Ip´s durchgecheckt hat

So siehts momentan aus:

Code:
#!/bin/bash

HOST1=192.168.0.31  #PC1
HOST2=192.168.0.23  #Laptop
HOST3=192.168.0.21  #TV1
HOST4=192.168.0.25  #TV2
HOST5=192.168.0.22  #PC2

_exit () {
   case $1 in
      1) echo "Kein Shutdown - Mindestens einer der PCs ist eingeschaltet" ;;
      2) echo "Kein PC online - Shutdown" ; shutdown -p now ;;
   esac
   exit $1;
}

# Checken ob PC's an sind
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;
# Wenn kein PC an ist, gehe zu Checken ob PC's im IP-Bereich an sind
else

# Checken ob PC's im IP-Bereich an sind
ip=192.168.0.                   #Netzadresse des eigenen Netzwerkes ohne den Hostanteil
i=21                            #checke Netz ab Hostanteil 21
while [ $i -le 40 ]             #checke Netz bis Hostanteil 40
        do
        ping -c 1 -i 1 $ip$i    #ping mit der zusammengesetzten IP-Adresse aus den o.a. Variablen "ip" und "i"
                if [ `ping -c 1 -i 1 $ip$i | grep -wc 100.0%` -eq 0 ]            #sobald einer der Hosts auf den ping antwortet, nicht herunterfahren
                then _exit 1    #beenden mit exit 1 (kein shutdown)
                fi
        i=$(( $i+1 ))           #erhöhe Hostanteil immer um 1
done

_exit 2                         # hat kein PC geantwortet, shutdown
fi

@M4jestix: so wie das skript jetzt ist wirds auch als cronjob ausgeführt und was ist der unterschied zwischen fping und normalem ping ?
oder meinst du das Programm ?
 
Zuletzt bearbeitet:
AW: Linux Skript für automatischen Shutdown

Sooo hab mir mal ein fertiges skript schon als sh Datei schicken lassen, dann per PSPad meine Ip´s eingetragen und es ging.

Keine Ahnung woran das lag.

Hattest Du die Datei vorher mit einem Windows-Editor geschrieben ?

Aber es wäre trotzdem noch gut wenn man die Paketgröße minimieren kann weils doch schon lange dauert bis er die ganzen Ip´s durchgecheckt hat

ping -c 1 -s 0 -W 0 -i 0
 
Ja genau einmal mit Windows Editor und einmal direkt aus nem anderen Forum in PSPad reinkopiert.

Danke für den Befehl werd ich gleich mal ausprobieren, momentan teste ich gerade das andere Skript deshalb pc aus ;)
 
AW: Linux Skript für automatischen Shutdown

Nur mal so nebenbei:
Ich hatte das vor kurzem mal FreeNAS getestet und fand es nicht grad so toll. Außerdem hing sich mein NAS damit doch des öfteren auf (Kernel Panic :banane:). Und als es dann beim einem Absturz den RAID Verbund löste und fast 3 Tage für einen rebuild brauchte, war die Sache mit FreeNAS gegessen. Wenn du also doch mal eine Alternative suchst, kann ich die OpenMediaVault empfehlen. Wird von eine deutschen entwickelt, der lange Zeit auch an FreeNAS bebaut hat. Konfiguration geht ist super schnell, ist einfach und läuft nun seit 2 Monaten stabil.
 
AW: Linux Skript für automatischen Shutdown

Ja das haben mir schon mehrere erzählt das sie Probleme mit FreeNas haben.

Ich persönlich bin völlig zufrieden damit hatte noch NIE Fehler oder Abstürze und seit der neusten Version funktioniert DLNA auch perfekt also ich kann da echt nicht meckern
 
Zuletzt bearbeitet:
AW: Linux Skript für automatischen Shutdown

ja dann wirds wohl daran gelegen haben.

Hab das mal mit ping -c 1 -s 0 -W 0 -i 0 ausprobiert anstatt ping -c 1 -i 1
ist aber leider auch nicht schneller.

Momentan funktioniert soweit aber alles ;)
Hab gerade mal den cron job eingerichtet
läuft auch ... zum Glück ohne Probleme
 
AW: Linux Skript für automatischen Shutdown

Womit stellst du denn eine evtl Geschwindigkeitsänderung des ganzen fest?? Inwiefern sollte/muss es denn schneller gehn?
 
AW: Linux Skript für automatischen Shutdown

Um das Skript zu testen nehm ich Putty und führe das ganz einmal aus dann sehe ich ja die einzelnen Schritte.
Ansich ists egal wie lange das dauert, wichtig ist nur das das NAS am ende wenn keine Pc´s mehr an sind runter fährt.

Aber er fängt ja z.B. bei 192.168.178.21 an pingt die an
das dauert ja schon ne weile
dann geht er ein höher sprich auf 192.168.178.22 bis auf .40
das dauert ewig

Ich dachte durch die Paketverkleinerung ists anpingen zack nächste anpingen und so weiter
ich vermute mal das es so lange dauert weil er mehrmals versucht die gleiche IP anzupingen bevor er es aufgibt (weil der pc ja aus ist) und dann erst zur nächsten übergeht.

denn wenn das NAS eine IP anpingt die auch ne Rückmeldung gibt also von einem PC der an ist, erkennt er das sofort und es geht auch sofort weiter


Kann das sein ?
 
AW: Linux Skript für automatischen Shutdown

Wenn dir der normale ping-Befehl wie du schreibst evtl. zu "langsam" ist teste doch mal das von mir vorgeschlagene "fping".... :-D funktioniert problemlos und evtl auch schneller da in diesem Fall kein weiterer Versuch unternommen wird ob eine IP erreichbar ist. In diesem Fall wird dann kein "alive" zurückgegeben!

MfG
 
AW: Linux Skript für automatischen Shutdown

kann ich einfach den befehl fping verwenden oder brauche ich dafür ein extra Programm.
denn wenn ich das google kommt nur: "fping - a program to ping hosts in parallel"
und dergleichen.


Denn wenn es ein Programm ist bekomm ich das auf FreeNas ja nicht zum laufen das ist zwar auf Linux Basis aber hat ja ansich keinen Desktop oder so
 
AW: Linux Skript für automatischen Shutdown

Das ist schon ein separates Paket. Müsstest du aber - wenn man es denn für BSD bekommt - über die Konsole installieren können. Bzw soweit ich mich erinnere gibt/gab es mal in der FreeNAS-Oberfläche eine Möglichkeit um zusätzliche Pakete zu installieren. FreeNAS ist bei mir allerdings schon ne Weile her, arebite mittlerweile nur noch mit "normalen" Linuxmaschinen da hier die Möglichkeiten für diverese Aufgaben wesentlich umfangreicher sind als in den beschnittenen BSD-Distributionen.
 
AW: Linux Skript für automatischen Shutdown

Ja gut aber das ist mir den Aufwand ehrlich gesagt nicht wert vor allem weils jetzt ja funktioniert.
Da müsste ich mich dann auch wieder einlesen und reinfuchen :D hab nämlich so ansich GAR KEINE ahnung vom Programmieren und Skripte schreiben :ugly:

Für die Dinge die ich mit dem Gerät machen will reicht Freenas aber auch völlig
ist ja nur zum Sichern und zum Bereitstellen von Daten im Netzwerk von daher...
 
AW: Linux Skript für automatischen Shutdown

Auch wenn es schon klappt, vlt. noch eine weitere Idee, falls du mal mehr als nur Ping checken willst :)
Ich checke mit dem Skript z.b. ob die Samba-Freigabe auf dem NAS grade benutzt wird, falls nein, zack, STR. (STD fand ich unnötig, da beides laut meines Strommessgerät gleich viel Strom zieht, aber STR erheblich schneller beim Resume ist ^^)
Und per WoL wirds dann wieder ausm Schlaf geholt.

AutoSuspend
 
Zuletzt bearbeitet:
Ja WoL hätte ich auch gerne.
Das Mainboard unterstütz das auch,
BIOS Einstellungen sind gemacht aber weder mit der Onboard Netzwerkkarte noch mit der die ich extra eingebaut habe funktioniert es

Erst dachte ich das liegt an Freenas also schnell mal Windows drauf gemacht und ging auch nicht.

Ist auch wieder so ne Sache die ich nicht verstehe... bei meinem normalen Rechner eine Option im BIOS umgestellt Zack funktioniert.

Momentan startet das Nas über ne Funksteckdose und restore on power loss Funktion.

Aber ich werd mir das mal reinziehen, evtl gibt's da ja wirklich noch was spannendes was man gebrauchen kann ;)
 
AW: Linux Skript für automatischen Shutdown

Für WOL brauchst du mitunter zumindest unter Linux evtl. das Paket "ethtool". Keine Ahnung ob es für dein FreeNAS auch gilt....
 
Zurück