Automatisches Herunterfahren wenn kein Ping möglich: Unterschied zwischen den Versionen

Aus
Keine Bearbeitungszusammenfassung
K (Pyload Abfrage verbessert)
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 100: Zeile 100:
#
#


PC=192.168.xxx
PC=192.168.100.1
LAPTOP=192.168.xxx
LAPTOP=192.168.100.50
HANDY=192.168.xxx
HANDY=192.168.100.51
waittime=300
waittime=300
LOGFILE=/tmp/autoshutdown.log
LOGFILE=/tmp/autoshutdown.log


MAXRETRYS=3
MAXRETRYS=4




log()
log()  
{
{
  echo $1 `date +%c` >> $LOGFILE
  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+1]; RETRY++)); do
for ((RETRY=1; RETRY<=$MAXRETRYS; RETRY++)); do  


   printf "\n\n\n" >>/tmp/autoshutdown.log
   printf "\n\n\n" >>$LOGFILE
   log "===== Versuch Nr.: $RETRY ====="
   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
   ping -c 1 -W 1 $PC >> $LOGFILE || ping -c 1 -W 1 $LAPTOP >> $LOGFILE || ping -c 1 -W 1 $HANDY >> $LOGFILE
Zeile 128: Zeile 131:




   if [ $RETRY == 3 ]; then
   if [ $RETRY == $MAXRETRYS ]; then
     break
     break
   fi
   fi
 
 
   if [ $RETRY != 0 ]; then
   if [ $RETRY != 0 ]; then
     log "===== Nächsten Versuch abwarten... ====="
     log "===== Nächsten Versuch abwarten... ====="
Zeile 147: Zeile 150:
   fi
   fi
</pre>
</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>





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