DS herunterfahren wenn kein Client mehr vorhanden

scars

Benutzer
Mitglied seit
16. Apr 2011
Beiträge
20
Punkte für Reaktionen
0
Punkte
1
Danke, es funktioniert :)

Mein Fehler lag in Ultraedit, habe nicht UNIX Konform abgespeichert.

Kann ich das Script dann auch für mehrere HOSTS nehmen oder ist das nur beschränkt auf einen?
 
Zuletzt bearbeitet:

raymond

Benutzer
Mitglied seit
10. Sep 2009
Beiträge
4.704
Punkte für Reaktionen
21
Punkte
118
Danke, es funktioniert :)

Mein Fehler lag in Ultraedit, habe nicht UNIX Konform abgespeichert.

Kann ich das Script dann auch für mehrere HOSTS nehmen oder ist das nur beschränkt auf einen?

Man kann auch copy und paste im vi editor machen. Okay am Anfang lässt dieser bei mir immer Zeichen weg, aber wenigstens hat man dann kein Problem mit den Zeilenumbruch.

Wunderbar, dass es funktioniert und gut zu hören, dass es auch andere Leute gebrauchen können.
Ich habe bisher nur einen eingetragen. Müsste mal schauen wie ich es umbastele, dass dieser mehrere pingt. Wenn einer davon nicht verfügbar ist, soll die NAS runterfahren, oder wie?
 

Ap0phis

Benutzer
Mitglied seit
16. Dez 2010
Beiträge
6.731
Punkte für Reaktionen
3
Punkte
158
... Wenn einer davon nicht verfügbar ist, soll die NAS runterfahren, oder wie?
"Wenn keiner davon mehr erreichbar ist " wäre imho logischer. ;)

... oder - um die Abfrage zu erleichtern - solange es noch einen verfügbaren Client gibt: Nicht runterfahren.
 

raymond

Benutzer
Mitglied seit
10. Sep 2009
Beiträge
4.704
Punkte für Reaktionen
21
Punkte
118
"Wenn keiner davon mehr erreichbar ist " wäre imho logischer. ;)

... oder - um die Abfrage zu erleichtern - solange es noch einen verfügbaren Client gibt: Nicht runterfahren.

Ich konnte es noch nicht testen, aber probiert mal aus:
targetpingdevice=
targetpingdevice2=
targetpingdevice3=

waittime=

while true; do
ping -c 1 $targetpingdevice || ping -c 1 $targetpingdevice2 || ping -c 1 $targetpingdevice3 > /dev/null
if [ $? == 1 ]; then
sleep $waittime
ping -c 1 $targetpingdevice || ping -c 1 $targetpingdevice2 || ping -c 1 $targetpingdevice3 > /dev/null
if [ $? == 1 ]; then
# shutdown DS
poweroff
fi
fi
sleep $waittime
done;

und gebt mir feedback. Danke. Klar kann man auch mit einer for Schleife lösen, aber dies erstmal auf die Schnelle (ich habe derzeit keine 3 clients da um dies zu testen).
 
Zuletzt bearbeitet:

scars

Benutzer
Mitglied seit
16. Apr 2011
Beiträge
20
Punkte für Reaktionen
0
Punkte
1
Servus,

habs jetzt getestet und mit den IPs herumgespielt. :)

Funktioniert mit allen konstellationen...

Danke & Gruss
 

raymond

Benutzer
Mitglied seit
10. Sep 2009
Beiträge
4.704
Punkte für Reaktionen
21
Punkte
118

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Hallo Leute,
habe das Wiki gerade nochmal erweitert um Ping und Protokollierung zu erhalten. Vom Prinzip her pingt das Script in 5 Minuten-Abständen fünfmal die Clients an und bei fünfmaligem Scheitern fährt sich die DS herunter.
Hier der Beitrag:

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.

Rich (BBCode):
#!/opt/bin/bash
#

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

MAXRETRYS=5


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

#Sicherheitsreserve um evtl. das Script deaktivieren zu können.
sleep 600

for ((RETRY=1; RETRY<$[MAXRETRYS+1]; RETRY++)); do

   printf "\n\n\n" >>/tmp/autoshutdown.log
   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

Anmerkungen sind natürlich jederzeit erwünscht.

VG, Martin
 
Zuletzt bearbeitet:

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Bist du sicher, dass die == Vergleiche in [ und ] funzen? Meine eigentlich der Vergleichsoperator sei = und ned ==
 

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Ich habe das Script jetzt schon recht ausgiebig getestet, indem ich die Waittime auf 10 gesetzt und die poweroff-Zeile auskommentiert habe. Zum Schluss lief alles nach Plan. Vielleicht fällt mir in den nächsten Tagen noch etwas auf, bei mir ist das Script nämlich nun "produktiv" :) Jetzt gerade ist die DS z.B. bei zweimaligem Neustarten des Routers heruntergefahren, das dürfte ja nicht sein. Ich werde jetzt das Log mal nach Volume1 speichern lassen und weiter beobachten....

Die == hatte ich übrigens dem Wiki-Eintrag entnommen...
http://www.synology-wiki.de/index.php/Automatisches_Herunterfahren_wenn_kein_Ping_möglich
 

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Ok, das Problem existierte auf meinem PC, der war nicht mehr pingbar... Man sollte eben nicht zu viele Baustellen aufmachen.

Script läuft also bisher einwandfrei :)
 

Wessix

Benutzer
Mitglied seit
14. Okt 2010
Beiträge
328
Punkte für Reaktionen
0
Punkte
22
hi, habe vor einiger Zeit mal an einem Script gearbeitet, das eine ähnliche Funktion habe sollte jedoch die DS nicht automatisch herunterfahren sollte, sondern prüfen ob noch jemand auf der DS arbeitet und wenn nicht einem x beliebigen user auch nicht admins erlauben sollte die ds herunterzufahren. lief ganz gut bis auf das überprüfen ob VPN clients angemeldet sind. Passt hier thematisch ganz gut dazu, und evtl hat jemand von euch Interesse daran und evtl. neue Ideen:
http://www.synology-forum.de/showthread.html?20582-Benutzer-Privilegien-Rechte&p=169054&viewfull=1#post169054


Grüße Wessix
 

ramseier

Benutzer
Mitglied seit
25. Dez 2011
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
hallo,
ich hätte auch interesse an so einem script, jedoch bin ich totaler linux-noob und habe meine DS111 auch erst seit nen paar tagen.
ich habe keine ahnung wie ich es "installieren" kann !?
Meine DS startet jeden morgen um 08:00 uhr und fährt aktuell um 0:00 runter aber das ist leider zu ungenau.
es wäre super wenn sie ab 22 uhr prüfen würde ob sie noch gebraucht wird. tagsüber macht diese prüfung keinen sinn, da sie obt leerlauf hat (arbeiten und so ;)
wie kann ich dies umsetzen ? achso, bin MAC-User

mfg
ramseier
 

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
@Wessix: Das ist ja wirklich genial! Vielen Dank für den Link. Ich bin gleich nach dem Autoshutdownscript auch auf pyload gestoßen und habe daher auch ein großes Interesse daran gehabt.

Ich habe mein Script nun entsprechend angepasst und ein paar Dinge bei Dir abgeguckt(Es wird nun geprüft, ob meine drei Clients noch erreichbar sind, ob ein pyload-Download läuft oder per Samba zugegriffen wird):

Rich (BBCode):
#!/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 "No downloads running" >/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


@ramseier:
In Deinem Fall ist das Einfachste wahrscheinlich über einen Cronjob zu gehen. Da gab es hier vorhergehend ein paar Tipps. Du musst Dich jedoch schon sehr mit der Materie auseinandersetzen, da gute Grundkenntnisse für dieses Vorhaben vorhanden sein sollten/müssen.
 

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Schade, ich kann meinen alten Beitrag nicht mehr bearbeiten.

Habe noch einen kleinen Schönheitsfehler in dem reinen Pingcheck gefunden, daher hier nochmal die letzte Version:

Rich (BBCode):
#!/opt/bin/bash
#

PC=192.168.xxx
LAPTOP=192.168.xxx
HANDY=192.168.xxx
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
 

ramseier

Benutzer
Mitglied seit
25. Dez 2011
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
...so es ist vollbracht ;)
ich habe meiner DS auch das automatische herunterfahren bei inaktivität an-dressiert :D
ich benutze ein für mich abgewandeltes script, welches ich hier im thread gefunden habe

das script startet bei mir per cronjob um 22:30
Rich (BBCode):
#!/bin/sh
HOSTS="xxx.xxx.xxx.xxx usw"

while true
do

		ONLINE=0
		DOWNLOAD=1
			
		# Download über HTTP aktiv
		if ! netstat | grep 'http' > /dev/null; then
				DOWNLOAD=0
		else
				DOWNLOAD=1
		fi 
		
		# IP's prüfen
		for host in $HOSTS ; do
			if ping -c 1 -w 1 $host > /dev/null; then
				ONLINE=1
		fi	
		done

		# PowerOff der DiskStation
		if [ $ONLINE -eq 0 ] && [ $DOWNLOAD -eq 0 ]; then
			sleep 5	
			/sbin/poweroff
		fi
					
		sleep 300
done

wenn es noch nen paar profi-tips geben sollte, immer her damit

ich habe auch gesehen das es bash scripte gibt aber ich bin eher auf der suche nach nem sh-script das ich nichtmal weiß was das ist *fg* bzw wie man dies wieder zu laufen bringt

sehr interessieren würde es mich wie man ein LOG nacht auf die festplatte schreibt, damit nicht ständig die platten anlaufen (deshalb bisher ohne LOG)
 

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Ich habe jetzt auch noch ein Update.
In der Pyload Abfrage war nicht berücksichtigt, dass Pyload auch mal gar nicht laufen könnte. Da lief der grep dann darauf hinaus, dass das Script dachte, Pyload sei aktiv.
Hier die korrigierte Fassung:
Rich (BBCode):
#!/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

@ramseier: Das Verschieben des Logs kannst Du auch einfach per Cronjob machen. Einfach den Befehl mv verwenden und immer mit vollen Pfadnamen arbeiten...
 

ramseier

Benutzer
Mitglied seit
25. Dez 2011
Beiträge
28
Punkte für Reaktionen
0
Punkte
0
was muss ich denn tun um dein bash-script zum laufen zu bringen (steht leider nicht im wiki)
oder würde das auch schon laufen ?

mfg
ramseier

edit: mit dem mv meinst du sicher das log aus dem tmp vorm shutdown zu verschieben oder ?
 
Zuletzt bearbeitet:

Moaddin

Benutzer
Mitglied seit
29. Dez 2011
Beiträge
29
Punkte für Reaktionen
0
Punkte
0
Also zunächst brauchst Du das Paketverwaltungsprogramm IPKG:
http://www.synology-wiki.de/index.php/IPKG

Anschließend kannst Du mit dem Befehl "ipkg install bash" die Bash installieren.

Man muss wahrscheinlich nicht viel verändern, damit mein Script auch in der ASH läuft, mir ist das jedoch zu mühselig herauszufinden.

Korrekt, mit mv kannst Du Dateien verschieben. Je nachdem was Du so mit Deinem Script aufrufst, schaltet die DS jedoch nicht mehr die Festplatten aus. Mit meinem Script ist dies definitiv der Fall, da ja z.B. python und pyload aufgerufen werden... Einfach ausprobieren...
 

zelle

Benutzer
Mitglied seit
25. Aug 2010
Beiträge
2
Punkte für Reaktionen
0
Punkte
1
Hi,
ich habe auf meiner DS210+ ein Script für den "shutdown ohne Client" laufen, das Script protokolliert alles in Log-Dateien.
Nun würde ich gerne wissen zu welcher IP welche MAC gehört, ich habe aber arp nicht auf der DS gefunden.
Die Clients sind auch nicht unbedingt mit der DS verbunden, sondern es wird einfach ein IP-Range überprüft.

Mit welchem Tool komme ich nun an die MAC des angepingten Clients?

Zelle
 


 

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