DS herunterfahren wenn kein Client mehr vorhanden

nice77

Benutzer
Mitglied seit
29. Dez 2008
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich habe eine DS209 und möchte diese immer abends automatisch herunterfahren lassen.
Es war nur hin und wieder ärgerlich wenn ich noch am Film schauen war, oder ein PC noch an war, und sich die DS dann still und leise verabschiedet hat.

Ich starte nun Abends über die Crontab alle 30 Minuten ein Script welches meine PC´s und Medienplayer anpingt, und somit feststellt ob noch ein Gerät an ist. Sollte dies nicht der Fall sein, wird der Shutdown durchgeführt.

Da ich mit Linux und Scripten nicht so der Kenner bin, stell ich das ganze mal hier rein, vielleicht gibts ja noch Ideen das ganze zu verbessern und auszubauen.
 

Anhänge

  • shutdown.txt
    515 Bytes · Aufrufe: 673

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Danke, das werde ich mir mal genauer anschauen :)
 

hagen

Benutzer
Mitglied seit
25. Dez 2009
Beiträge
1
Punkte für Reaktionen
0
Punkte
0
leicht überarbeitet

Hallo,
habe die Idee dankend aufgenommen und etwas modifiziert.
Falls ein Rechnerneustart eines der zu überwachenden Rechner durchgeführt wird soll das Nas natürlich in dieser Zeit nicht herunterfahren. Den IP Adresseneingabe der Hosts habe ich etwas vereinfacht. Der erste Teil des Subnetzes wird automatisiert ermittelt und mann mus nur noch den letzten Block der IP Adressen definieren. Bsp. 192.168.0.5 - 192.168.0.200 Konfiguration: 5 = _IP_START; 200 = _IP_ENDE; _SLEEP = zeit die zwischen 2 checks gewartet wird in Sekunden.
Das Subnetz 192.168.0. wird automatisch ermittelt, muss also nicht festgelegt werden und so funktioniert das Script auch weiter falls mann sein Netz mal ändert.
__________________________
Synology DS110j mit WD15EADS 1,5TB

 

Anhänge

  • shutdown.txt
    780 Bytes · Aufrufe: 336
Zuletzt bearbeitet von einem Moderator:

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Auch ich hab das Script etwas verändert - es wird noch bevor die Diskstation ausgeschalten wird geprüft ob eine Sicherung läuft.

Rich (BBCode):
#!/bin/sh                                                                                                                
                                                                                                                         
# List of Hosts to check                                                                                                 
HOSTS="192.168.23.111 192.168.23.112"                                                                                    
LOGFILE=/var/log/shutdown.log                                                                                            
                                                                                                                         
log() {                                                                                                                  
        echo `date +%c` $1 >> $LOGFILE                                                                                  
}                                                                                                                        
                                                                                                                         
log "try to shutdown"                                                                                                    
                                                                                                                         
if [ ! "$(pidof synolocalbkp)" ]; then                                                                                   
        ONLINE=0                                                                                                         
                                                                                                                         
        for host in $HOSTS ; do                                                                                          
                if ping -c 3 -w 1 $host > /dev/null; then                                                                
                        ONLINE=1                                                                                         
                        log "$host isn't offline"                                                                        
                fi                                                                                                       
        done                                                                                                             
                                                                                                                         
        if [ $ONLINE -eq 0 ]; then                                                                                       
                log "shutdown Diskstation"                                                                               
                /sbin/poweroff                                                                                         
        fi                                                                                                               
fi

Der Eintrag für Cron lautet:
Rich (BBCode):
*/15	23-3	*	*	*	root	/bin/sh /root/customshutdown.sh

Was ich gerne noch einbauen würde wäre eine Prüfung ob eine AFP-Freigabe aktiv benutzt wird. Über netstat kann man ja zumindest schon mal herausfinden das der afpd angesprochen wird aber leider kann man nicht sehen ob die Freigabe nur eingehängt ist oder ob auch wirklich noch Daten fließen. Würde das Ganze für meinen Mediacenter-MacMini brauchen der rund um die Uhr läuft.
 

jahlives

Moderator
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
2
Punkte
0
Ich würde deinen Code noch in eine Schleife packen. Wenn das Synobkp noch läuft soll die Schleife einfach x-Sekunden warten (sleep) und dann erneut probieren ob runtergefahren werden kann.
Du könntest ggf die verschiedenen Prozesse auf Last prüfen, um festzustellen, dass wirklich keine Daten mehr fliessen
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Durch den cronjob wird doch das Script alle 15 Minuten im Zeitfenster von 23 bis 3 Uhr gestartet ;)
 

jahlives

Moderator
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
2
Punkte
0
Durch den cronjob wird doch das Script alle 15 Minuten im Zeitfenster von 23 bis 3 Uhr gestartet ;)
Sorry den cronjob habe ich "übersehen" ;) Ich dachte es wird nur einmal aufgerufen. So funzt es natürlich auch :)
 

coolhot

Benutzer
Mitglied seit
01. Mrz 2009
Beiträge
926
Punkte für Reaktionen
0
Punkte
0
Nur so als Idee zur Anregung:

Erweiterung des Skripts auf Prüfung der Aktivität der Downloadstation also Last auf amule und rtorrent.

Ich weiß leider nicht ob die Last der Prozesse zuverlässig zu ermitteln ist.
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Habe das Script noch einmal etwas umgebastelt. Es prüft nun ob auf meinem Mediacenter MacMini Plex läuft. Die abzuspielende Filmdateien liegen auf der Diskstation weswegen es vorallem am Wochenende sehr ungünstig ist wenn sie abends einfach herunterfährt.

Rich (BBCode):
#!/bin/sh                                                                                                                                              
                                                                                                                                                       
# List of Hosts to check                                                                                                                               
HOSTS="192.168.23.111 192.168.23.112"                                                                                                                  
MEDIACENTER="192.168.23.10"                                                                                                                            
MEDIACENTERUSER="user123"                                                                                                                               
LOGFILE=/var/log/shutdown.log                                                                                                                          
                                                                                                                                                       
                                                                                                                                                       
log() {                                                                                                                                                
        echo `date +%c` $1 >> $LOGFILE                                                                                                                 
}                                                                                                                                                      
                                                                                                                                                       
log "try to shutdown"                                                                                                                                  
                                                                                                                                                       
ONLINEMC=0                                                                                                                                             
if [ "$(ping -c 3 -w 1 $MEDIACENTER)" > /dev/null ]; then                                                                                              
        if [ "$(ssh $MEDIACENTERUSER@$MEDIACENTER ps aux | grep Plex.app)" ]; then                                                                     
                ONLINEMC=1                                                                                                                             
                log "Mediacenter is running"                                                                                                           
        fi                                                                                                                                             
fi                                                                                                                                                     
                                                                                                                                                       
ONLINE=0                                                                                                                                               
if [ ! "$(pidof synolocalbkp)" ] && [ $ONLINEMC -eq 0 ]; then                                                                                          
        for host in $HOSTS ; do                                                                                                                        
                if [ "$(ping -c 3 -w 1 $host)" > /dev/null ]; then                                                                                     
                        ONLINE=1                                                                                                                       
                        log "$host isn't offline"                                                                                                      
                fi                                                                                                                                     
        done                                                                                                                                           
                                                                                                                                                       
        if [ $ONLINE -eq 0 ]; then                                                                                                                     
                log "shutdown Diskstation"                                                                                                             
                /sbin/poweroff                                                                                                                       
        fi                                                                                                                                             
fi
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
In dem zuletzt geposteten Script ist ein Fehler und ich habe leider keine Möglichkeit gesehen den Post zu bearbeiten.

Die Zeilen der Ping-Befehle in den IF-Abfragen werden von
Rich (BBCode):
if [ "$(ping -c 3 -w 1 $host)" > /dev/null ]; then
wieder zurück zu
Rich (BBCode):
if ping -c 3 -w 1 $host > /dev/null; then
geändert. Die erste Variante gibt immer nur FALSE zurück.

Die korrigierte Version sieht so aus:
Rich (BBCode):
#!/bin/sh

# List of Hosts to check
HOSTS="192.168.23.111 192.168.23.112"
MEDIACENTER="192.168.23.10"
MEDIACENTERUSER="user123"
LOGFILE=/var/log/shutdown.log


log() {
	echo `date +%c` $1 >> $LOGFILE
}

log "try to shutdown"

ONLINEMC=0
if ping -c 3 -w 1 $MEDIACENTER > /dev/null; then
	if [ "$(ssh $MEDIACENTERUSER@$MEDIACENTER ps aux | grep Plex.app)" ]; then
		ONLINEMC=1
		log "Mediacenter is running"
	fi
fi

ONLINE=0
if [ ! "$(pidof synolocalbkp)" ] && [ $ONLINEMC -eq 0 ]; then
	for host in $HOSTS ; do
		if ping -c 3 -w 1 $host > /dev/null; then
			ONLINE=1
			log "$host isn't offline"
		fi
	done

	if [ $ONLINE -eq 0 ]; then
		log "shutdown Diskstation"
		/sbin/poweroff
	fi
fi
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
7
Punkte
0
Warum werden eigentlich nicht die 'geöffneten' Netzwerk-Verbindungen nicht untersucht (netstat -an)?

Warum wird nicht nach laufenen Servieces im Verzeichnis /var/run nachgeschaut?

Sind die Einträge zu unscharf oder spiegeln sie nicht den Betrieb wider?

Itari
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Also in meinem Fall greift niemand weiteres auf meine Diskstation zu deswegen werden in der Regel keine Verbindungen in der Zeit nach 23 Uhr stattfinden außer evtl. die Sache mit dem Mediacenter. Zudem greife ich mit meinen Macs nur über AFP auf die Freigaben zu. Fährt die Diskstation dann herunter werden die Clients automatisch benachrichtigt und trennen selbstständig die Verbindung.
 

ic167

Benutzer
Mitglied seit
04. Jan 2010
Beiträge
25
Punkte für Reaktionen
0
Punkte
0
Möchte dieses Thema nochmal aufgreifen. Habe bei meiner 210j das auf Seite 1 gepostete Script versucht zum laufen zu bekommen. Leider scheitert es daran das der Client der gepingt werden soll nicht auf den Ping reagiert (eine Xbox 360, laut diversen Beiträgen in anderen Foren reagiert die nicht auf nen Ping).
Ist es denkbar das Script so zu verändern, dass die DS sich dann ausschaltet wenn der Medienserver keine Daten mehr sendet? Und in diesem Zusammenhang, wäre es auch möglich zusätzlich die Aktivität der Download-Station abzufragen bevor der Shutdown gestartet wird?
Habe ehrlich gesagt keine Ahnung wie so ein Script aussehen könnte, bin aber gerne bereit es zu lernen...
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Man könnte prüfen ob die Xbox eine Verbindung zur Diskstation aufrecht hält, also sprich ob sie Daten empfängt. Könnte mir vorstellen das man das alleine mit "netstat" abfragen kann.

Das mit der Downloadstation müsste ich mir erst einmal ansehen.
 

maze128

Benutzer
Mitglied seit
03. Jan 2010
Beiträge
227
Punkte für Reaktionen
0
Punkte
0
Ja, mit netstat hatte ich auch schon überlegt.
Ich weiß aber nicht wie man da was (für das Script) verwertbares raus bekommt.
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Ich habe selber keine Xbox und kann auch gerade nicht auf meine Diskstation zugreifen aber im Groben müsste doch folgendes Script bzw. folgender Code ausreichen:

Rich (BBCode):
#!/bin/sh

XBOXIP=192.168.1.123
if ! netstat -n | grep $XBOXIP'.*ESTABLISHED' > /dev/null; then
	# xbox ist nicht verbunden
fi
 

maze128

Benutzer
Mitglied seit
03. Jan 2010
Beiträge
227
Punkte für Reaktionen
0
Punkte
0
In dem Fall wäre sie doch verbunden oder?

Für mich wäre der interessanteste Teil ob noch ein Download läuft, ich nutze die Xbox nicht zum schauen, sondern hab nen WDTV-Client.

Allerdings wäre das Script so zumindest schonmal besser als ein Ping....
 

user123

Benutzer
Mitglied seit
16. Sep 2009
Beiträge
20
Punkte für Reaktionen
0
Punkte
0
Nein, der Befehl prüft ob die Xbox eben nicht verbunden ist was ja notwendig ist damit die Diskstation herunterfahren kann. Aber wie gesagt das ist nur ein Beispiel wie so eine Prüfung aussehen könnte.

Nebenbei gesagt müsste aber diese Überprüfung der Erreichbarkeit bei dem WD Live genauso funktionieren weil das Gerät ja auch nur "lesend" zugreift. Aber da kann ich mir wiederum vorstellen das das WD Live auf eine Ping-Anfrage antwortet.

Das mit der Downloadstation schau ich mir wie gesagt später mal an. Mal gucken wie das genau funktioniert.
 

maze128

Benutzer
Mitglied seit
03. Jan 2010
Beiträge
227
Punkte für Reaktionen
0
Punkte
0
Ich dachte in diesem Fall wäre die Box noch verbunden:

Rich (BBCode):
netstat -n | grep $XBOXIP'.*ESTABLISHED' > /dev/null

Der WDTV reagiert auf nen Ping, von daher funktioniert das auch mit der geposteten Version des Scripts, ist nur doof wenn das Ding z.B. um 2.00 Uhr runterfährt und halt wie gesagt noch ein Download läuft.

Kannst ja mal schauen ob du was findest, würde mich freuen.....