AutoShutdown

scriptkiddy

New member
5 Aug. 2014
3
0
1
Hallo Zusammen,
durch ein wenig googeln bin ich auf ein Skript gestoßen, mit dem es möglich ist das NAS automatisch herunterzufahren, wenn eine bestimmte IP in einem Zeitintervall X zweimal nicht erreichbar war.
Das Skript startet bei mir direkt nach dem booten des NAS und funktioniert auch soweit, jedoch zeigt mir das NAS auf dem Display seitdem immer nur BootingApp an. Diese Meldung verschwindet auch nicht, da das Skript ja logischerweise in einer Schleife läuft, damit das NAS auch später noch herunterfahren kann.

Das Skript sieht wie folgt aus: (/volume1/.@plugins/etc/init.d/S99AutoShutdown)

# shutdown Asustor 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=192.168.188.1
waittime=150

while true; do
ping -c 4 $host > /dev/null
if [ $? == 1 ]; then
sleep $waittime
ping -c 4 $host > /dev/null
if [ $? == 1 ]; then
poweroff
fi
fi
sleep $waittime
done;

Das Skript kommt ursprünglich von hier:
http://www.synology-wiki.de/index.php/Automatisches_Herunterfahren_wenn_kein_Ping_möglich

Dort ist am Ende der Seite noch ein Startskript für das eigentliche Shutdown Skript zu finden, welches meiner Meinung nach aber beim Asustor nicht notwendig ist, da es ja in dem richtigen Pfad mit dem richtigen Dateinamen automatisch startet.
Hat von euch einer eine Idee, wenn ich die BootingApp anzeige wieder wegbekomme, mein Skript aber weiterhin läuft?
 

Tormin

Super Moderator
17 Dez. 2012
107
0
0
Schmeiss die while-Schleife aus dem Skript und lass das Skript alle paar Minuten per Cron starten. Das ist viel schöner als so eine "busy waiting" Schleife und löst Dein Problem.
 

scriptkiddy

New member
5 Aug. 2014
3
0
1
So habe gerade versucht es zu einem cronjob umzubauen. Die While und letzte sleep habe ich dazu aus dem Skript entfernt und es testweise mal an folgenden Ort kopiert:
/volume0/usr/builtin/etc/crontabs/AutoShutdown

Die Datei root habe ich wie folgt ergänzt:
1 0 * * * /bin/sh /volume0/usr/builtin/etc/crontabs/AutoShutdown

Nur führt er den Cronjob nicht aus, wenn ich den eingetragenen Befehl manuell ausführe klappt es. Wenn ich das richtig verstanden habe von der Syntax her, sollte versucht werden das Skript jede Minute zu starten oder?
 

Raleigh

New member
7 Aug. 2013
8
0
0
@scriptkiddy

Bis du so nett und lädst dein fertiges script irgendwo hoch. Es gibt bestimmt andere die daran Interesse hätten. Oder setze den Inhalt des scripts hier nochmal rein. Danke.


Grüße
Raleigh
 

ju55

New member
28 Jan. 2014
18
0
1
Ich wäre auch für ein fertiges Script dankbar.
Idealerweise eines auf Basis der Variante für mehrere Hosts von der Synology-Seite!
Viele Grüße
 

Tormin

Super Moderator
17 Dez. 2012
107
0
0
Da sich skriptkiddy nicht mehr meldet habe ich mal alles raus geschmissen, was man nicht braucht. Es bleibt dann nur noch das übrig, wenn man es über Cron startet:

# shutdown Asustor 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=192.168.188.1

ping -c 4 $host > /dev/null
if [ $? == 1 ]; then
poweroff
fi
 

Tormin

Super Moderator
17 Dez. 2012
107
0
0
Bei mehreren PCs sieht es dann so aus:

Hier im Beipsiel 3 PCs. Mit delay wird eine Toleranzzeit in Sekunden angegeben, die ein Host nicht antworten darf, z.B. wenn er gerade neu startet.

host1=x.x.x.x
host2=y.y.y.y
host3=z.z.z.z
delay=ww

ping -c 1 $host1 || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null
if [ $? == 1 ]; then
sleep $delay
ping -c 1 $host1 || ping -c 1 $host2 || ping -c 1 $host3 > /dev/null
if [ $? == 1 ]; then
poweroff
fi
fi
 

Raleigh

New member
7 Aug. 2013
8
0
0
@ Tormin


Ich danke dir vielmals für deine Bereitschaft, auch anderen helfen zu wollen. So hat es doch jeder der daran Interesse hat und sich damit schwer tut, leichter.



Grüße
Raleigh
 

ju55

New member
28 Jan. 2014
18
0
1
Danke für das Script, ich werde es morgen direkt testen.
In der letzten Zeile meinst Du doch $delay und nicht $waittime?
Viele Grüße
 

Tormin

Super Moderator
17 Dez. 2012
107
0
0
Die letzte Zeile mit der Variablen ist ganz überflüssig und kann raus. Ich habe es im Post geändert.
 

Tormin

Super Moderator
17 Dez. 2012
107
0
0
Ihr könnte auch im Windows Autostart einen Aufruf von einem DOS WoL Tool auf die Mac-Adresse des Asustor hinterlegen, dann bootet das NAS beim booten von Windows auch automatisch mit.

Im NAS muß dazu nur WoL aktiviert werden. Wenn Ihr statt normalem WOL den Asustor S3 Schlafmodus verwendet, den nur Asustor hat, dann ist das Gerät sogar in wenigen Sekunden voll da und muß selbst nicht komplett booten. Der Stromverbrauch liegt im S3 Modus bei 0,5 bis etwas über einem Watt, je nach Gerät.
 

Harry

New member
6 Sep. 2014
7
0
0
Hallo,

ich habe den Autoshutdown dank euren Posts nun endlich hin bekommen!
Weiß vielleicht jemand den Konsolenbefehl um das NAS dann nicht herunter zu fahren
sondern in den S3 Modus zu versetzen?
 

Harry

New member
6 Sep. 2014
7
0
0
Hab´s gefunden!:) Es ist kein shell Befehl sonder ein schon vorhandenes script!

etc/init.d/NASsuspend

Bei mir läuft es zwar, aber ich weis nocht genau ob ich das script richtig aus dem AutoShutdown.sh script starte!
Wie sollte das denn richtig aussehen?

Was noch super wäre vor dem S3-Modus noch zu überprüfen ob nicht gerade ein HD-Zugriff erfolgt.
Wenn z.B. gerade auf dem Tablet Musik vom NAS gehört wird sollte es nicht schlafen gehen! :cool:
 

ju55

New member
28 Jan. 2014
18
0
1
Bei mir läuft es zwar, aber ich weis nocht genau ob ich das script richtig aus dem AutoShutdown.sh script starte!
Wie sollte das denn richtig aussehen?
Eigentlich ganz einfach, Du musst nur poweroff durch /etc/init.d/NASsuspend ersetzen.

Was noch super wäre vor dem S3-Modus noch zu überprüfen ob nicht gerade ein HD-Zugriff erfolgt.
Wenn z.B. gerade auf dem Tablet Musik vom NAS gehört wird sollte es nicht schlafen gehen! :cool:
Du denkst sicher an die Energieverwaltung, wie man sie vom PC kennt. Also noch einer einer gewissen Zeit ohne Aktivität schalten zuerst die Festplatten ab, und anschließend geht der PC irgendwann automatisch in den S3-Modus.
Diese Art von Automatik wäre auch für mich die eleganteste Lösung.
Ich weiss aber nicht, ob eine Abfrage des HD-Status per Script überhaupt möglich ist, allerdings sind meine Scripting-Kenntnisse auch mehr als bescheiden.
Die Ping-Methode funktioniert zwar zuverlässig, allerdings mußte ich feststellen, dass meine Squeezeboxen auch im Standby anpingbar sind. Also lasse ich nur meinen Fernseher vom NAS anpingen.
Damit kann ich aber natürlich nur dann mit den Squeezeboxen auf den NAS zugreifen, wenn der Fernseher an ist, sonst fährt der NAS beim nächsten erfolglosen Ping "gnadenlos" runter.
Vielleicht gibt es aber auch bald ein Lösung direkt von Asusstor.
Viele Grüße
 

Harry

New member
6 Sep. 2014
7
0
0
Ja an sowas ähnliches hab ich gedacht! Bei meinem Windows Homeserver gab es ein Tool
das hieß Lights Out. In der lizenzierten Version konnte man sämmtliche Geräte im Netzwerk
überwachen. Der Server ging dann nur in den S3 Modus wenn keines der Geräte mehr auf
ihn zugriff.

http://www.homeserversoftware.com/

Leider gibt es das nicht für Linux.

Vielleicht ist es möglich den Freigaben-Service, (SMB Service !?) zu
überwachen? Glaube sowas in einem Synology Forum gelesen zu haben.
Finde es aber leider nicht mehr!

Ein App währe natürlich die beste und einfachste Lösung.
Wundert mich eh das es sowas noch nicht gibt!
 

slick0815

New member
23 Feb. 2015
3
0
0
Hallo,
ich wollte nur mal kurz mein Script vorstellen. Es "überwacht" Clients (Ping), Samba (offene Dateiverbindungen), FTP, Https und laufende Prozesse.
Es liegt bei mir in /volume1/.@plugins/etc/script/shutdown.sh. Aufgerufen wird es über Crontabs /volume0/usr/builtin/etc/crontabs/root mit folgender Zeile */60 * * * * /bin/sh /volume1/.@plugins/etc/script/shutdown.sh (Start alle 60 Minuten).
Es kann einfach über zb FTP oder Web-Interface parametriert werden (einfach Dateien umbenennen). Dazu habe ich einen Ordner auf dem NAS, in dem dann die Dateien liegen und das Debug ausgegeben wird. (Beispiel: /volume1/Benutzer/autoshutdown/shutdown_lan_on bedeutet vorhanden und damit überwacht) (/volume1/Benutzer/autoshutdown/shutdown_on bedeutet Hauptschalter an)

Code:
#!/bin/sh
# Variablendeklaration
DEBUG=1;
clients="192.168.0.50 192.168.0.150";
ftp=1;
https=1;
sambanetwork=192.168.0;
samba=1;
offfile="/volume1/Benutzer/autoshutdown/shutdown_off";
offset=1;
user=1;
clients_on=1;
damons="rsync";
damon_use=1;
offfile_https="/volume1/Benutzer/autoshutdown/shutdown_https_off";
offset_https=1;
offfile_lan="/volume1/Benutzer/autoshutdown/shutdown_lan_off";
offset_lan=1;
offfile_ftp="/volume1/Benutzer/autoshutdown/shutdown_ftp_off";
offset_ftp=1;
offfile_smb="/volume1/Benutzer/autoshutdown/shutdown_smb_off";
offset_smb=1;
offfile_user="/volume1/Benutzer/autoshutdown/shutdown_user_off";
offset_user=1;
offfile_damon="/volume1/Benutzer/autoshutdown/shutdown_damon_off";
offset_damon=1;

#Konfiguration per Datei
if [ -e $offfile_https ]; then
	offset_https=1
		else
	offset_https=0
fi
if [ -e $offfile_lan ]; then
	offset_lan=1
		else
	offset_lan=0
fi
if [ -e $offfile_ftp ]; then
	offset_ftp=1
		else
	offset_ftp=0
fi
if [ -e $offfile_smb ]; then
	offset_smb=1
		else
	offset_smb=0
fi
if [ -e $offfile_damon ]; then
	offset_damon=1
		else
	offset_damon=0
fi
if [ -e $offfile_user ]; then
	offset_user=1
		else
	offset_user=0
fi

#clients
IsOnline()
{
        for i in $*; do
		ping $i -c1
		if [ "$?" == "0" ]; then
		return 1
		fi
        done
	return 0
}
        IsOnline $clients
        if [ "$?" == "1" ] && [ $offset_lan -eq 0 ] ; then
        clients_on=1
        else
        clients_on=0		
        fi



# Samba
if [ `smbstatus -b | grep $sambanetwork | wc -l ` != "0" ] && [ $offset_smb -eq 0 ] ;  then
    samba=1
	else
	samba=0
fi

#offffile
if [ -e $offfile ]; then
	offset=1
	else
	offset=0
fi

#user
if [ `who | wc -l` -gt 1 ] && [ $offset_user -eq 0 ] ; then
	user=1
	else
	user=0
fi



#Abfrage FTP 1=Verbindung besteht
if  [ `netstat | grep -c ftp` -gt 0 ] && [ $offset_ftp -eq 0 ] ; then
				ftp=1	
		else
				ftp=0
fi 

#Abfrage Https 1=Verbindung besteht
if  [ `netstat | grep -c https` -gt 0 ]  && [ $offset_https -eq 0 ] ; then
				https=1
		else

		        https=0		
fi 

#Damon
IsDamonActive()
{
        for i in $*; do
                if [ `ps | grep -c $i` -gt 1 ] ; then
                return 1
                fi
        done

        return 0
}	
IsDamonActive $damons
        if [ "$?" == "1" ] && [ $offset_damon -eq 0 ]; then
                damon_use=1
				else
				damon_use=0
        fi

#Debuginfo schreiben
if [ $DEBUG -eq 1 ]; then
    echo $(date +"%d.%m.%y %H:%M") Offfile = $offset >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") Samba = $samba >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") FTP = $ftp >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") Https = $https >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") User = $user >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
    echo $(date +"%d.%m.%y %H:%M") Clients = $clients_on >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") Damon in use = $damon_use >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo $(date +"%d.%m.%y %H:%M") Offfile = $offset;
	echo $(date +"%d.%m.%y %H:%M") FTP = $ftp;
	echo $(date +"%d.%m.%y %H:%M") Https = $https;
	echo $(date +"%d.%m.%y %H:%M") Samba = $samba;
	echo $(date +"%d.%m.%y %H:%M") User = $user;
	echo $(date +"%d.%m.%y %H:%M") Clients = $clients_on;
	echo $(date +"%d.%m.%y %H:%M") Damon in use = $damon_use
fi
#Detail info Debug
if [ $DEBUG -eq 1 ] && [ $offset -eq 1 ]; then
	echo Autoshutdown ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo Autoshutdown ausgeschaltet;
	fi
	
if [ $DEBUG -eq 1 ] && [ $samba -eq 1 ]; then
	echo Samba noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	smbstatus -b | grep $sambanetwork >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo Samba noch online
	smbstatus -b | grep $sambanetwork
	fi

if [ $DEBUG -eq 1 ] && [ $ftp -eq 1 ]; then
	echo FTP noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	! netstat | grep 'ftp' >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo FTP noch online
	! netstat | grep 'ftp'
	fi

if [ $DEBUG -eq 1 ] && [ $https -eq 1 ]; then
	echo Https noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	! netstat | grep 'https' >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo Https noch online
	! netstat | grep 'https'
	fi        
	
	if [ $DEBUG -eq 1 ] && [ $user -eq 1 ]; then
	echo User noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	who >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	echo User noch online
	who
	fi
	
if [ $DEBUG -eq 1 ] && [ $clients_on -eq 1 ]; then
      echo Clients noch online;	
	  echo Clients noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
	  for clients in $clients
        do
          if ping -c1 $clients > /dev/null 2>&1
          then
            echo "Der Zielrechner $clients ist online"
			echo "Der Zielrechner $clients ist online"  >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
          fi
        done
		fi
if [ $DEBUG -eq 1 ] && [ $damon_use -eq 1 ]; then
      echo Prozess noch online;	
	  echo Prozess noch online >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
damon_debug() 
	( for i in $*
        do
          if [ `ps | grep -c $i` -gt 1 ]; then
            echo "Der Prozess $i ist online"
			echo "Der Prozess $i ist online"  >> /volume1/Benutzer/autoshutdown/DEBUG.txt;
          fi
        done
		)
		
damon_debug $damons
fi	
#Debug Konfiguration per Datei
	if [ $DEBUG -eq 1 ] && [ $offset_smb -eq 1 ]; then
	echo SMB-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo SMB-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_lan -eq 1 ]; then
	echo Ping-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo Ping-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_ftp -eq 1 ]; then
	echo FTP-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo FTP-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_https -eq 1 ]; then
	echo Https-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo Https-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_damon -eq 1 ]; then
	echo Damon-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo Damon-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_user -eq 1 ]; then
	echo User-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo User-Ueberwachung ausgeschaltet;
	fi
	if [ $DEBUG -eq 1 ] && [ $offset_lan -eq 1 ]; then
	echo Client-Ueberwachung ausgeschaltet >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	echo Client-Ueberwachung ausgeschaltet;
	fi
	
	
	
	
	
	if [ $DEBUG -eq 1 ]; then	
	echo -------------------------------- >> /volume1/Benutzer/autoshutdown/DEBUG.txt;	
	fi
	
if [ $samba -eq 0 ] && [ $ftp -eq 0 ] && [ $https -eq 0 ] && [ $offset -eq 0 ] && [ $user -eq 0 ] && [ $clients_on -eq 0 ] && [ $damon_use -eq 0 ]; then
	echo $(date +"%d.%m.%y %H:%M") Keine Clients mehr online - shutdown \	>> /volume1/Benutzer/autoshutdown/shutdown.log;
#	echo $(date +"%d.%m.%y %H:%M") Keine Clients mehr online - shutdown \
	/etc/init.d/NASsuspend;
#poweroff;	
fi


exit 0;

Sollten alle Überwachungen es erlauben, wird das NAS in den Ruhemodus gefahren. Ein richtiges herrunterfahren ist über powerdown auch möglich.
Ich hoffe es ist hilfreich.
 

ju55

New member
28 Jan. 2014
18
0
1
Hallo slick0815,
Danke für Deine Mühe.
Ich habe bisher das Script von Tormin genutzt, mit dem der Status der Clients per ping geprüft wird.
Ich greife mit einer Squeezebox Touch per App "Logitech Media Server" auf meine Musikdateien zu. Leider kann das Script bei der Touch nicht funktionieren, man kann sie auch ausgeschaltet anpingen.
Mit einem Script, das den Status der Apps bzw der dazugehörenden Prozesse prüft, wäre mir natürlich geholfen.
Neben dem "Logitech Media Server" nutze ich noch "XBMC" und "Serviio". Leider habe ich nur minimale Kenntnisse, meine Frage also an Dich: könnte man Dein Script so anpassen, dass es auch mit meinen Apps funktioniert?
Asus weist übrigens selbst darauf hin, dass Apps wie XBMC den Ruhemodus bei den Asustors verhindern.