DS herunterfahren wenn kein Client mehr vorhanden

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.
Ich dachte in diesem Fall wäre die Box noch verbunden:

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

Ja, das ist auch so. Aber in meinem Beispiel drehe ich durch das Ausrufezeichen die IF-Abfrage um. Das kann man ja machen wie man möchte, je nachdem was man verarbeiten möchte :)
 
Folgendes Script läuft gerade auf meiner DS und es scheint so zu funktionieren mit meiner Xbox 360:

#!/bin/sh

LOGFILE=/var/log/shutdown.log

log() {
echo `date +%c` $1 >> $LOGFILE
}
log "try to shutdown"

ONLINE=1

XBOXIP=192.168.0.110
if ! netstat -n | grep $XBOXIP'.*ESTABLISHED' > /dev/null; then
ONLINE=0
fi

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


Irgendwelche Einwände es so zu machen oder aber auch Verbesserungsvorschläge?
Bliebe noch die Idee mit dem Script zu prüfen ob die Downloadstation aktiv ist und dann keinen shutdown zu machen.
 
Zuletzt bearbeitet:
Vielleicht könnte man für das prüfen der DL-Aktivität die CPU-Last der Prozesse wie rtorrent usw. aus der Ausgabe von ps extrahieren?

Wenn alle 0 sind dann herunterfahren.
 
Habe mir noch ein bißchen angeschaut was beim Aufruf von netstat alles so erscheint und mir ist aufgefallen das sobald die DownloadStation läuft eine IP mit einer ":http"-Endung angezeigt wird. Habe dann mal das Script folgendermaßen erweitert:

#!/bin/sh

LOGFILE=/var/log/shutdown.log

log() {
echo `date +%c` $1 >> $LOGFILE
}
log "try to shutdown"

ONLINE=1

XBOXIP=192.168.0.110
if ! netstat -n | grep $XBOXIP'.*ESTABLISHED' > /dev/null; then
if ! netstat | grep 'http' > /dev/null; then
ONLINE=0
fi
fi

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


Die zweite If-Abfrage schaut ob beim Aufruf von netstat "http" erscheint. Bisher hat das Script alle Trockenübungen erfolgreich durchlaufen. Heut Nacht wird dann mal die DownloadStation angeschmissen und das Script per cronjob alle 30 Minuten ausgeführt.
Morgen kann ich dann hoffentlich Erfolge melden.
Noch ne Frage am Rande: Kann es sein das der Befehl netstat-n nur alle paar Minuten ausgeführt werden kann? Meine DS hat zumindest nicht reagiert wenn man den Befehl zweimal direkt hintereinander ausführt.
Wie immer bitte ich um Kritik und Verbesserungsvorschläge zu diesem Script, bin echt kein Experte.
 
Ich hab das noch bißchen verändert.
Könnte man sicher eleganter lösen, aber so funktioniert es bei mir:

Rich (BBCode):
#!/bin/sh

LOGFILE=/var/log/shutdown.log
HOSTS="192.168.178.28"                                                                                    
log() {
        echo `date +%c`: $1 >> $LOGFILE
}
ONLINE=1
DOWNLOAD=1

for host in $HOSTS ; do                                                                                          
	if ! netstat | grep 'http' > /dev/null; then
		DOWNLOAD=0
	fi 
		if ! ping -c 3 -w 1 $host > /dev/null; then                                                             
			ONLINE=0
		fi   
done 


        if [ $ONLINE -eq 1 ] && [ $DOWNLOAD -eq 0 ]; then
                log "WDTV läuft!" 
						printf "\n" >> $LOGFILE
        fi
		
		if [ $DOWNLOAD -eq 1 ] && [ $ONLINE -eq 0 ]; then
                log "Download läuft!" 
						printf "\n" >> $LOGFILE
        fi
		
		if [ $DOWNLOAD -eq 1 ] && [ $ONLINE -eq 1 ]; then
                log "Download und WDTV laufen!" 
						printf "\n" >> $LOGFILE
        fi
		
		if [ $ONLINE -eq 0 ] && [ $DOWNLOAD -eq 0 ]; then
                log "Diskstation wird herunter gefahren!" 
						printf "\n" >> $LOGFILE
                /sbin/poweroff
        fi


Ich hab den Ping-Befehl benutzt weil der WDTV-Client nen Ping zurück liefert und netstat -n für die Abfrage ob ein Download läuft.

Somit ist zumindest rapidshare abgedeckt und das reicht (zumindest mir)!
 
Und wenn der Download nicht via http, sondern via ftp oder bt/emule erfolgt?
 
Naja, dazu muss das Script halt angepasst werden.

Aber Emule/FTP etc. interessiert mich nicht und so hab ich mit
meinen (wenigen) Möglichkeiten und meinem Wissen ein
funktionierendes Script gebastelt! :D

(der Großteil stammt natürlich aus diesem Thread, aber ich
hab's für meine Bedürfnisse angepasst und das freut mich)
 
So, hier nochmals eine abgeänderte Version nach Rücksprache mit maze.
Ähnelt sehr stark seinem Script, allerdings nochmals der Hinweis das dieses Script nur benötigt wird wenn man einen Client hat der nicht pingbar ist, in meinem Fall eine Xbox 360. Hat man z.B. einen WDTV Client sollte man denke ich besser das Script von maze nehmen.
Vielen Dank nochmals an alle die mitgeholfen haben das Script zu erstellen!!


Rich (BBCode):
#!/bin/sh

LOGFILE=/var/log/shutdown.log

log() {
        echo `date +%c :` $1 >> $LOGFILE
}
	DOWNLOAD=1 
	ONLINE=1

XBOXIP=192.168.0.110
if ! netstat -n | grep $XBOXIP'.*ESTABLISHED' > /dev/null; then
	ONLINE=0	
fi		

if ! netstat | grep 'http' > /dev/null; then
	DOWNLOAD=0
fi


if [ $ONLINE -eq 1 ] && [ $DOWNLOAD -eq 0 ] ; then
	log "XBOX läuft!"
					printf "\n" >> $LOGFILE
fi

if [ $DOWNLOAD -eq 1 ] && [ $ONLINE -eq 0 ]; then
    log "Download läuft!" 
					printf "\n" >> $LOGFILE
fi

if [ $DOWNLOAD -eq 1 ] && [ $ONLINE -eq 1 ]; then
                log "Download und XBOX laufen!" 
						printf "\n" >> $LOGFILE
fi
		
if [ $ONLINE -eq 0 ] && [ $DOWNLOAD -eq 0 ]; then
                log "Diskstation wird heruntergefahren!" 
						printf "\n" >> $LOGFILE
                /sbin/poweroff
fi
 

Anhänge

Hallo miteinander,

sorry das ich das Thema noch einmal auspacke.
Kann mir jemand einen Link bzw. kurz erklären wie ich ein Script oder Cron-jop/tab auf die DS kopiere und zum laufen bringe.:o
Ich lese mich jetzt schon einige Zeit durch das Forum aber irgendwie finde ich keine Anleitung dazu (oder ich sehe den Wald vor lauter Bäumen nicht).
Leider kenne ich mich mit Linux und Co gar nicht aus.

Danke

PS: MySQL und IPKG habe ich installiert bekommen :D
 
Zuletzt bearbeitet:
MySQL brauchst du nicht wirklich.

Du brauchst zwingend:

- Telnet Zugang zur DS

Ganz nett wäre noch folgendes:

- root gemountet, so dass du per Filestation/FTP drauf zugreifen kannst
- Cronjobs (3rd-Party-Application von itari) incl. init_3rdparty.spk Paket

Ich erklär dir mal die komplette Version, da das einfacher ist und auch komfortabler für nachfolgende Veränderungen.

Du installiert init_3rdparty.spk und Cronjobs.spk (in dieser Reihenfolge).

Dann mountest du root z.B. so:

Rich (BBCode):
/bin/mount -o bind / /volume1/root/

Das musst du per Telnet eingeben und vorher den Ordner root im Hauptverzeichnis z.B. durch die Filestation erstellen.
Dieser Befehl mountet (verknüpft) das root-Verzeichnis, auf das du in der Filestation keinen Zugriff hast auf Volume1.

Du kannst auch direkt ein Script machen, das beim Start ausgeführt wird:

Rich (BBCode):
#!/bin/sh
case $1 in
start)
       /bin/mount -o bind / /volume1/root/
        ;;
stop)
       /bin/umount /volume1/root/
        ;;
*)
        echo "Usages: $0 [start|stop]"
        ;;
esac

Dieses script speicherst du einfach unter /usr/syno/etc.defaults/rc.d
Damit wird es dann beim Start automatisch ausgeführt.

Wichtig ist, dass du die Script unter Windows nicht einfach mit dem Editor bearbeiten kannst, du brauchst Notepad++ (Freeware).
Da dann unter Bearbeiten - Zeilenende auf Konvertiere zu UNIX (LF) umstellen und als IRGENDWAS.sh abspeichern und in den angegeben Ordner kopieren.

Danach suchst du dir eins der geposteten Scripts aus (sind ja jetzt hier einige Versionen gepostet worden) und speicherst es auch in Notepad++ wie beschrieben ab.

Dann kopierst du es z.B. in /usr/bin und installierst init_3rparty.spk und Cronjobs. Dann per Telnet einloggen (immer mit root und admin-Passwort) und jeweils in den Ordner wechseln, in den du die Scripte kopiert hast:

Mit cd .. kommst du eine Ebene höher und mit CD ORDNERNAME in das entsprechende Verzeichnis. Das musst du dann wie gesagt für beide Scripte machen und jeweils chmod +x SCRIPTNAME.sh eingeben.
Damit machst du das Script ausführbar.

Dann in Cronjobs (unter 3rd-Party-Apps auf der DS) einen "Job" eintragen (vergleichbar mit dem Taskmanager unter windows). Das läuft folgendermaßen ab:

Du siehst dort diverse Felder, die so aufgebaut sind:

1. Feld: Minute
2. Feld: Stunde
3. Feld: Tag im Monat
4. Feld: Monat
5. Feld: Wochentag
6. Benutzer
7. Pfad

Also müsste das z.B. so aussehen:

*/20 3-8 * * *root /usr/bin/SCRIPTNAME.sh

Dann auf save & restart klicken.

Damit wird das Script alle 20 min zwischen 3 und 8 Uhr ausgeführt, also das erste mal um 3 und das letzte Mal um 8:40 Uhr.
Benutzer ist immer root und der Pfad entsprechendem dem wo du das Script zum runterfahren abgelegt hast.

Das sollte es so in etwas sein, falls ich was vergessen hab meld dich einfach!
 
Hi maze128,

erst einmal vielen Danke für deine Bemühungen. :D

init_3rdparty.spk und Cronjobs.spk sind installiert.
Das Script :
#!/bin/sh
case $1 in
start)
/bin/mount -o bind / /volume1/root/
;;
stop)
/bin/umount /volume1/root/
;;
*)
echo "Usages: $0 [start|stop]"
;;
esac


habe ich im Ordner root den ich im DS- Manager unter gemeinsame Ordner erstellt habe unter mount_root.sh mit Notepad++ gespeichert.
(in der Filestation konnte ich keinen Ordner erstellen bzw. nur in einem schon vorhandenen Ordner)
Wie kopiere ich nun die Datei in den */usr/syno/etc.defaults/rc.d* Ordner?
Unter telnet root habe ich mich angemeldet aber ich komme auch nicht in den neu erstellten Ordner root. Ich lande immer wieder im Ordner wenn ich mich unter Telnet anmelde. :mad:
 
er bringt die Meldung fehlgeschlagen : erfolgreich???

Das kommische ist, ich bin im Ordner Volume1 wie man sieht ist auch der Ordner root zu sehen?
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    43 KB · Aufrufe: 301
Zuletzt bearbeitet:
Dem Mount fehlt eine Leerstelle und ein / ist am Ende zu viel:

mount -o bind /(leerstelle)/volume1/root

Itari
 
Hi itari,

danke ich glaube jetzt hat es funktioniert, er brachte auf jeden Fall keinen Fehler. Aber ich komme immer noch nicht in das root Verzeichnis bzw. in keinen Ordner unter Volume1 :mad:


Und dann stehe ich noch vor dem großen Kopierproblem. Wie kopiere ich unter telnet eine *.sh Datei in den jeweiligen Pfad? Kann ich die Datei wie unter Windows, in eine Zwischenablage kopieren und dann zum jeweiligen Ordner z.B. /usr/syno/etc.defaults/rc.d wechseln und dann wieder einfügen? Wobei ich gerade gemerkt habe, dass ich auch nicht in das Verzeichnis /usr/syno/etc.defaults/rc.d komme weil mir die Berechtigung fehlt.:mad:

Vielen Dank noch einmal für eure Hilfe, ich kann mir gut vorstellen das es für die die sich auskennen etwas nervig ist aber ich komme alleine leider nicht weiter.
 
ja, ich habe erst den root Ordner mit dem DS-Manager erstellt.:confused:
 
ok, ich komme doch in das /usr/syno/etc.defaults/rc.d Verzeichnis.
Ich habe cd vergessen :rolleyes:
 
Hallo,

Ich habe immer noch das Kopierproblem.
Ich sehe jetzt unter Windows die Ordner auf root aber ich kann nichts einfügen weil mir die Berechtigungen fehlen. Ich bin auf meinem NB als Admin angemeldet und habe mir im DSM die Berechtignungen für root gegeben.
Wenn ich es unter Telnet mit
*cp /sourceDirectory/sourceFile /destination*
versuche, geht es auch nicht.:mad:

Hat noch jemand einen Tipp.:o
 

Anhänge

  • kopieren.PNG
    kopieren.PNG
    10,1 KB · Aufrufe: 289
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat