Automatisches Herunterfahren wenn kein Ping möglich: Unterschied zwischen den Versionen
imported>Raymond |
imported>Moaddin K Pyload Abfrage verbessert |
||
(27 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 18: | Zeile 18: | ||
* wie man den [[Der_Editor_vi|vi-Editor]] bedient | * wie man den [[Der_Editor_vi|vi-Editor]] bedient | ||
* wie man einstellt bzw. dass man ICMP (ping) auf dem Zielgerät zulässt. '''Es wird empfohlen dies vorher von der DiskStation mit "ping ip-adresse" oder "ping name" zu testen''' | * wie man einstellt bzw. dass man ICMP (ping) auf dem Zielgerät zulässt. '''Es wird empfohlen dies vorher von der DiskStation mit "ping ip-adresse" oder "ping name" zu testen''' | ||
* | * dass jeder ping durchkommen muss, wenn das Zielgerät online ist. Lahme/instabile Netzwerke sind daher tabu. | ||
== Hinweis == | == Hinweis == | ||
Zeile 28: | Zeile 28: | ||
== Installation == | == Installation == | ||
Kopiere folgendes Script in eine Datei bspw. '''autoshutdown.sh''': | === Anpingen einer IP/Client === | ||
Kopiere folgendes Script in eine Datei (beachte das der Zeilenumschub bei Windows und Mac OS X/Linux unterschiedlich ist, also im Editor unter Windows (bspw. Ultraedit) "LF" anstatt "CR LF" oder "UNIX konform" einstellen ([http://de.wikipedia.org/wiki/Zeilenumbruch#Codierung_des_Zeilenumbruchs wikipedia]) oder gleich in den [[Der_Editor_vi|vi-Editor]] auf die Synology kopieren) bspw. '''autoshutdown.sh''': | |||
<pre> | <pre> | ||
#!/bin/sh | #!/bin/sh | ||
Zeile 34: | Zeile 35: | ||
# | # | ||
# VARIABLES TO EDIT | # VARIABLES TO EDIT | ||
# | # host: network device (eg. router or PC) as reference (name or IP) | ||
# waittime (in seconds): time between each ping (for PC: use min. reboot time) to prevent shutdown while rebooting | # waittime (in seconds): time between each ping (for PC: use min. reboot time) to prevent shutdown while rebooting | ||
host= | |||
waittime= | waittime= | ||
while true; do | while true; do | ||
ping -c 1 $ | ping -c 1 $host > /dev/null | ||
if [ $? == 1 ]; then | if [ $? == 1 ]; then | ||
sleep $waittime | sleep $waittime | ||
ping -c 1 $ | ping -c 1 $host > /dev/null | ||
if [ $? == 1 ]; then | |||
# shutdown DS | |||
poweroff | |||
fi | |||
fi | |||
sleep $waittime | |||
done; | |||
</pre> | |||
=== Anpingen mehrere IPs/Clients === | |||
Falls die DS herunterfahren soll, wenn mehrere Clients (in dem Fall alle 3) nicht verfügbar sind, kann dieses Script verwendet werden: | |||
<pre> | |||
#!/bin/sh | |||
# shutdown the DS if another network device is not available anymore | |||
# | |||
# VARIABLES TO EDIT | |||
# host: network device (eg. router or PC) as reference (name or IP) | |||
# host2: network device (eg. router or PC) as reference (name or IP) | |||
# host3: network device (eg. router or PC) as reference (name or IP) | |||
# waittime (in seconds): time between each ping (for PC: use min. reboot time) to prevent shutdown while rebooting | |||
host= | |||
host2= | |||
host3= | |||
waittime= | |||
while true; do | |||
ping -c 1 $host || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null | |||
if [ $? == 1 ]; then | |||
sleep $waittime | |||
ping -c 1 $host || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null | |||
if [ $? == 1 ]; then | if [ $? == 1 ]; then | ||
# shutdown DS | # shutdown DS | ||
Zeile 55: | Zeile 89: | ||
Anschließend sollte mit '''chmod 755 autoshutdown.sh''' die Rechte gesetzt werden. | Anschließend sollte mit '''chmod 755 autoshutdown.sh''' die Rechte gesetzt werden. | ||
=== Anpingen mehrerer IPs/Clients und führen eines Protokolls (BASH) === | |||
ACHTUNG: Dieses Script habe ich für die Bash geschrieben, wer möchte kann es gerne für die ASH modifizieren und ebenfalls hier einfügen. | |||
Hinweis: Das Protokoll lasse ich nach /tmp schreiben, da dann der Ruhezustand der Festplatten nicht beeinflusst werden sollte. Nach einem Neustart ist dieses natürlich weg. | |||
<pre> | |||
#!/opt/bin/bash | |||
# | |||
PC=192.168.100.1 | |||
LAPTOP=192.168.100.50 | |||
HANDY=192.168.100.51 | |||
waittime=300 | |||
LOGFILE=/tmp/autoshutdown.log | |||
MAXRETRYS=4 | |||
log() | |||
{ | |||
echo $1 `date +%c` >> $LOGFILE | |||
} | |||
log "===== Autoshutdown-Script wurde gestartet... =====" | |||
#Sicherheitsreserve um evtl. das Script deaktivieren zu können. | |||
sleep 600 | |||
for ((RETRY=1; RETRY<=$MAXRETRYS; RETRY++)); do | |||
printf "\n\n\n" >>$LOGFILE | |||
log "===== Versuch Nr.: $RETRY =====" | |||
ping -c 1 -W 1 $PC >> $LOGFILE || ping -c 1 -W 1 $LAPTOP >> $LOGFILE || ping -c 1 -W 1 $HANDY >> $LOGFILE | |||
if [ $? == 0 ]; then | |||
log "===== Mindestens ein Client ist erreichbar =====" | |||
RETRY=0 | |||
fi | |||
if [ $RETRY == $MAXRETRYS ]; then | |||
break | |||
fi | |||
if [ $RETRY != 0 ]; then | |||
log "===== Nächsten Versuch abwarten... =====" | |||
fi | |||
sleep $waittime | |||
done | |||
if [ $RETRY == $MAXRETRYS ]; then | |||
log "===== DS wird heruntergefahren =====" | |||
poweroff | |||
exit | |||
fi | |||
</pre> | |||
=== Anpingen mehrerer IPs/Clients, Pyload-Aktiv-Check, Samba-Aktiv-Check und Führen eines Protokolls (BASH) === | |||
ACHTUNG: Dieses Script habe ich für die Bash geschrieben, wer möchte kann es gerne für die ASH modifizieren und ebenfalls hier einfügen. | |||
Hinweis: Das Protokoll lasse ich nach /tmp schreiben, so dass es bei jedem Neustart neu angelegt wird. | |||
<pre> | |||
#!/opt/bin/bash | |||
# | |||
PC=192.168.xxx | |||
NOTEBOOK=192.168.xxx | |||
HANDY=192.168.xxx | |||
waittime=300 | |||
LOGFILE=/tmp/autoshutdown.log | |||
MAXRETRYS=4 | |||
log() | |||
{ | |||
echo "$1" `date +%c` >> $LOGFILE | |||
} | |||
printf "\n\n\n" >>$LOGFILE | |||
log "===== Autoshutdown-Script wurde gestartet... =====" | |||
#Sicherheitsreserve um evtl. das Script deaktivieren zu können. | |||
sleep 600 | |||
for ((RETRY=1; RETRY<=$MAXRETRYS; RETRY++)); do | |||
printf "\n\n\n" >>$LOGFILE | |||
log "======= Versuch Nr.: $RETRY ================= " | |||
ping -c 1 -W 2 $PC >/dev/null | |||
if [ $? == 0 ]; then | |||
log "== PC erreichbar : ja =========== " | |||
PC_AKTIV=1 | |||
RETRY=0 | |||
else | |||
log "== PC erreichbar : nein =========== " | |||
PC_AKTIV=0 | |||
fi | |||
ping -c 1 -W 2 $NOTEBOOK >/dev/null | |||
if [ $? == 0 ]; then | |||
log "== Notebook erreichbar: ja =========== " | |||
NOTEBOOK_AKTIV=1 | |||
RETRY=0 | |||
else | |||
log "== Notebook erreichbar: nein =========== " | |||
NOTEBOOK_AKTIV=0 | |||
fi | |||
ping -c 1 -W 2 $HANDY >/dev/null | |||
if [ $? == 0 ]; then | |||
log "== Handy erreichbar : ja =========== " | |||
HANDY_AKTIV=1 | |||
RETRY=0 | |||
else | |||
log "== Handy erreichbar : nein =========== " | |||
HANDY_AKTIV=0 | |||
fi | |||
/opt/bin/python /opt/pyload/pyLoadCli.py status |grep -e "No downloads running" -e "Could not establish connection to 192.168" >/dev/null | |||
if [ $? == 1 ]; then | |||
log "== Pyload aktiv : ja =========== " | |||
PYLOAD_AKTIV=1 | |||
RETRY=0 | |||
else | |||
log "== Pyload aktiv : nein =========== " | |||
PYLOAD_AKTIV=0 | |||
fi | |||
smbstatus -q|grep "192.168.100" >/dev/null | |||
if [ $? == 0 ]; then | |||
log "== Samba aktiv : ja =========== " | |||
SAMBA_AKTIV=1 | |||
RETRY=0 | |||
else | |||
log "== Samba aktiv : nein =========== " | |||
SAMBA_AKTIV=0 | |||
fi | |||
if [ $[PC_AKTIV+NOTEBOOK_AKTIV+HANDY_AKTIV+PYLOAD_AKTIV+SAMBA_AKTIV] == 0 ] && [ $RETRY == $MAXRETRYS ]; then | |||
break | |||
fi | |||
if [ $RETRY = 0 ]; then | |||
log "==== In $waittime Sek. geht's von vorne los == " | |||
else | |||
log "===== Nächsten Versuch abwarten... ===== " | |||
fi | |||
sleep $waittime | |||
done | |||
if [ $RETRY == $MAXRETRYS ]; then | |||
log "===== DS wird heruntergefahren ========= " | |||
poweroff | |||
exit | |||
fi | |||
</pre> | |||
== Erstellen des Startscripts == | == Erstellen des Startscripts == | ||
Erstelle das Startscript in '''/usr/syno/etc/rc.d''' damit es beim Hochfahren der DS gestartet wird. Ich habe dafür die Datei ''' | Erstelle das Startscript in '''/usr/syno/etc/rc.d''' damit es beim Hochfahren der DS gestartet wird. Ich habe dafür die Datei '''S99zzautoshutdown.sh''' mit folgendem Inhalt erstellt (Dateiname/pfad anpassen nicht vergessen): | ||
<pre> | <pre> | ||
Zeile 68: | Zeile 277: | ||
;; | ;; | ||
stop) | stop) | ||
killall autoshutdown.sh | killall autoshutdown.sh | ||
killall sleep | |||
;; | ;; | ||
restart) | restart) | ||
Zeile 80: | Zeile 290: | ||
== The End == | == The End == | ||
Das Script eignet sich sehr gut in Verbindung mit automatisch hochfahren, welches direkt in der DSM unter '''Bedienfeld > Energie-Zeitplan > Erstellen > Start > Datum''' aufgeführt ist. | |||
Ich hoffe dieser Artikel ist verständlich und hilfreich. Wer Verbesserungen hat, ist gerne eingeladen diese hier einzupflegen. | Ich hoffe dieser Artikel ist verständlich und hilfreich. Wer Verbesserungen hat, ist gerne eingeladen diese hier einzupflegen. | ||
Der gleiche Ansatz nur mit mehreren Ausnahmen: http://www.synology-forum.de/showthread.html?8769-DS-herunterfahren-wenn-kein-Client-mehr-vorhanden |
Aktuelle Version vom 7. Januar 2012, 23:33 Uhr
Installation von Software, die nicht von Synology kommt geht immer auf eigenes Risiko. Zum Teil sind dabei tiefe Eingriffe ins System nötig und das muss über die Konsole erledigt werden. Dabei besteht das Risiko von Fehlmanipulationen die bis zur Neuinstallation der DS führen können. Und dabei ist das Risiko sehr groß, dass auch die Partitionen mit Userdaten formatiert werden müssen. Also alles was ihr macht geht auf Eure eigene Kappe :-)
Wenn man keine Lust hat, die DiskStation beispielsweise über Nacht laufen zu lassen (Stromsparen, Lautstärke, Lampen) und auch keine Lust hat oder vergisst diese abends herunterzufahren, habe ich ein Script geschrieben, welches die DS automatisch herunterfährt falls EIN Netzwerkgerät (PC, Router…) für eine bestimmte Zeit nicht verfügbar ist.
Voraussetzungen
Ich gehe in diesem Artikel davon aus, dass der geneigte Leser weiß:
- wie man sich per Telnet/SSH auf die DS einloggt
- wie man den vi-Editor bedient
- wie man einstellt bzw. dass man ICMP (ping) auf dem Zielgerät zulässt. Es wird empfohlen dies vorher von der DiskStation mit "ping ip-adresse" oder "ping name" zu testen
- dass jeder ping durchkommen muss, wenn das Zielgerät online ist. Lahme/instabile Netzwerke sind daher tabu.
Hinweis
Es erfolgt kein Hinweis irgendwelcher Art, bevor die DS heruntergefahren wird. Man sollte sich daher gut überlegen:
- wie hoch die Zeit (in Sekunden) der Variable waittime sein sollte; lieber am Anfang etwas höher und dann langsam absenken
- ob man es als Startscript einträgt
Installation
Anpingen einer IP/Client
Kopiere folgendes Script in eine Datei (beachte das der Zeilenumschub bei Windows und Mac OS X/Linux unterschiedlich ist, also im Editor unter Windows (bspw. Ultraedit) "LF" anstatt "CR LF" oder "UNIX konform" einstellen (wikipedia) oder gleich in den vi-Editor auf die Synology kopieren) bspw. autoshutdown.sh:
#!/bin/sh # shutdown the DS if another network device is not available anymore # # VARIABLES TO EDIT # host: network device (eg. router or PC) as reference (name or IP) # waittime (in seconds): time between each ping (for PC: use min. reboot time) to prevent shutdown while rebooting host= waittime= while true; do ping -c 1 $host > /dev/null if [ $? == 1 ]; then sleep $waittime ping -c 1 $host > /dev/null if [ $? == 1 ]; then # shutdown DS poweroff fi fi sleep $waittime done;
Anpingen mehrere IPs/Clients
Falls die DS herunterfahren soll, wenn mehrere Clients (in dem Fall alle 3) nicht verfügbar sind, kann dieses Script verwendet werden:
#!/bin/sh # shutdown the DS if another network device is not available anymore # # VARIABLES TO EDIT # host: network device (eg. router or PC) as reference (name or IP) # host2: network device (eg. router or PC) as reference (name or IP) # host3: network device (eg. router or PC) as reference (name or IP) # waittime (in seconds): time between each ping (for PC: use min. reboot time) to prevent shutdown while rebooting host= host2= host3= waittime= while true; do ping -c 1 $host || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null if [ $? == 1 ]; then sleep $waittime ping -c 1 $host || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null if [ $? == 1 ]; then # shutdown DS poweroff fi fi sleep $waittime done;
Anschließend sollte mit chmod 755 autoshutdown.sh die Rechte gesetzt werden.
Anpingen mehrerer IPs/Clients und führen eines Protokolls (BASH)
ACHTUNG: Dieses Script habe ich für die Bash geschrieben, wer möchte kann es gerne für die ASH modifizieren und ebenfalls hier einfügen.
Hinweis: Das Protokoll lasse ich nach /tmp schreiben, da dann der Ruhezustand der Festplatten nicht beeinflusst werden sollte. Nach einem Neustart ist dieses natürlich weg.
#!/opt/bin/bash # PC=192.168.100.1 LAPTOP=192.168.100.50 HANDY=192.168.100.51 waittime=300 LOGFILE=/tmp/autoshutdown.log MAXRETRYS=4 log() { echo $1 `date +%c` >> $LOGFILE } log "===== Autoshutdown-Script wurde gestartet... =====" #Sicherheitsreserve um evtl. das Script deaktivieren zu können. sleep 600 for ((RETRY=1; RETRY<=$MAXRETRYS; RETRY++)); do printf "\n\n\n" >>$LOGFILE log "===== Versuch Nr.: $RETRY =====" ping -c 1 -W 1 $PC >> $LOGFILE || ping -c 1 -W 1 $LAPTOP >> $LOGFILE || ping -c 1 -W 1 $HANDY >> $LOGFILE if [ $? == 0 ]; then log "===== Mindestens ein Client ist erreichbar =====" RETRY=0 fi if [ $RETRY == $MAXRETRYS ]; then break fi if [ $RETRY != 0 ]; then log "===== Nächsten Versuch abwarten... =====" fi sleep $waittime done if [ $RETRY == $MAXRETRYS ]; then log "===== DS wird heruntergefahren =====" poweroff exit fi
Anpingen mehrerer IPs/Clients, Pyload-Aktiv-Check, Samba-Aktiv-Check und Führen eines Protokolls (BASH)
ACHTUNG: Dieses Script habe ich für die Bash geschrieben, wer möchte kann es gerne für die ASH modifizieren und ebenfalls hier einfügen.
Hinweis: Das Protokoll lasse ich nach /tmp schreiben, so dass es bei jedem Neustart neu angelegt wird.
#!/opt/bin/bash # PC=192.168.xxx NOTEBOOK=192.168.xxx HANDY=192.168.xxx waittime=300 LOGFILE=/tmp/autoshutdown.log MAXRETRYS=4 log() { echo "$1" `date +%c` >> $LOGFILE } printf "\n\n\n" >>$LOGFILE log "===== Autoshutdown-Script wurde gestartet... =====" #Sicherheitsreserve um evtl. das Script deaktivieren zu können. sleep 600 for ((RETRY=1; RETRY<=$MAXRETRYS; RETRY++)); do printf "\n\n\n" >>$LOGFILE log "======= Versuch Nr.: $RETRY ================= " ping -c 1 -W 2 $PC >/dev/null if [ $? == 0 ]; then log "== PC erreichbar : ja =========== " PC_AKTIV=1 RETRY=0 else log "== PC erreichbar : nein =========== " PC_AKTIV=0 fi ping -c 1 -W 2 $NOTEBOOK >/dev/null if [ $? == 0 ]; then log "== Notebook erreichbar: ja =========== " NOTEBOOK_AKTIV=1 RETRY=0 else log "== Notebook erreichbar: nein =========== " NOTEBOOK_AKTIV=0 fi ping -c 1 -W 2 $HANDY >/dev/null if [ $? == 0 ]; then log "== Handy erreichbar : ja =========== " HANDY_AKTIV=1 RETRY=0 else log "== Handy erreichbar : nein =========== " HANDY_AKTIV=0 fi /opt/bin/python /opt/pyload/pyLoadCli.py status |grep -e "No downloads running" -e "Could not establish connection to 192.168" >/dev/null if [ $? == 1 ]; then log "== Pyload aktiv : ja =========== " PYLOAD_AKTIV=1 RETRY=0 else log "== Pyload aktiv : nein =========== " PYLOAD_AKTIV=0 fi smbstatus -q|grep "192.168.100" >/dev/null if [ $? == 0 ]; then log "== Samba aktiv : ja =========== " SAMBA_AKTIV=1 RETRY=0 else log "== Samba aktiv : nein =========== " SAMBA_AKTIV=0 fi if [ $[PC_AKTIV+NOTEBOOK_AKTIV+HANDY_AKTIV+PYLOAD_AKTIV+SAMBA_AKTIV] == 0 ] && [ $RETRY == $MAXRETRYS ]; then break fi if [ $RETRY = 0 ]; then log "==== In $waittime Sek. geht's von vorne los == " else log "===== Nächsten Versuch abwarten... ===== " fi sleep $waittime done if [ $RETRY == $MAXRETRYS ]; then log "===== DS wird heruntergefahren ========= " poweroff exit fi
Erstellen des Startscripts
Erstelle das Startscript in /usr/syno/etc/rc.d damit es beim Hochfahren der DS gestartet wird. Ich habe dafür die Datei S99zzautoshutdown.sh mit folgendem Inhalt erstellt (Dateiname/pfad anpassen nicht vergessen):
#!/bin/sh case "$1" in start) echo "Starting autoshutdown script..." /volume1/private/autoshutdown.sh & ;; stop) killall autoshutdown.sh killall sleep ;; restart) $0 stop sleep 1 $0 start ;; esac
The End
Das Script eignet sich sehr gut in Verbindung mit automatisch hochfahren, welches direkt in der DSM unter Bedienfeld > Energie-Zeitplan > Erstellen > Start > Datum aufgeführt ist.
Ich hoffe dieser Artikel ist verständlich und hilfreich. Wer Verbesserungen hat, ist gerne eingeladen diese hier einzupflegen. Der gleiche Ansatz nur mit mehreren Ausnahmen: http://www.synology-forum.de/showthread.html?8769-DS-herunterfahren-wenn-kein-Client-mehr-vorhanden