Cronjob für Etherwake / Ohne Freetz

Samsung_Freak

Mitglied
Mitglied seit
14 Nov 2008
Beiträge
206
Punkte für Reaktionen
0
Punkte
16
Guten Tag,
ich bin auf der Suche eine Lösung zu finden wie ich meine zwei Homeserver Zeitgesteuert von der Fritzbox starten lasse via Wake on Lan. Ich möchte allerdings kein Freetz auf meine Fritzbox bringen. Gibt es eine Variante wie ich das hinbekommen kann ohne das ich meine Fritzbox modifizieren muss. Es handelt sich um eine FritzBox 7170 mit der neusten Firmware.

Freue mich auf eure Antworten!
 
Die Box kann stardardmäßig "date", "sleep" und "ether-wake", damit ließe sich das schon simulieren...

So aus dem Kopf in der Art:
Code:
#!/bin/sh
#Start Stunde und Minute
START_H=${TOSTART%%\:*}
START_M=${TOSTART##*\:}
# Jetzt
NOW_H=$(date +%H)
NOW_M=$(date +%M)
# Differenzen
DIFF_H=$(( $START_H - $NOW_H ))
DIFF_M=$(( $START_M - $NOW_M ))

# DIFF_M < 0 
#  - schon "hinter" der gewünschten Minute -> 1 Stunde weniger "warten"
#  - Zu wartende Minuten DIFF_M + 60
if [ $DIFF_M -lt 0 ]; then 
	DIFF_H=$(( $DIFF_H - 1)) 
	DIFF_M=$(( $DIFF_M  + 60)) 
fi

# DIFF_H < 0
#  - schon "hinter" der gewünschten Stunde, -> 24 + DIFF_H warten
if [ $DIFF_H -lt 0 ]; then 
	DIFF_H=$(( $DIFF_H  + 24)) 
fi

SEC_TO_SLEEP=$(( $DIFF_H * 3600 + $DIFF_M * 60 ))
(sleep $SEC_TO_SLEEP ; ether-wake -i $EW_IF $MAC )&
Dann noch außerhalb die entsprechenden Variablen setzen:
Code:
export MAC=00:12:34:56:78:9a
export EW_IF=eth0
export TOSTART=13:30


Jörg
 
Generell sollte es möglich sein, cron auf die Box zu bringen und auszuführen. Möglicherweise müssen dafür Pfade angepaßt werden, damit sie in den beschreibbaren Teil der Box zeigen.

Je nach dem von Dir gewünschten Verhalten kannst Du auch ein Skript dafür erstellen. Vom Speicherplatzbedarf ist das sicher kleiner.
 
Hallo,
erstmal vielen Dank für die Antworten und das Script! Eine Frage vorweg, wofür ist sleept gut?

Ich habe es folgendermaßen geplant. Es handelt sich bei mir um zwei Rechner. Einer der beiden Rechner mit der MAC Adresse 00:C1:26:11:CA:01 soll jeden Morgen um 10 Uhr hochfahren! Der Server mit der MAC Adresse 00:24:8C:51:B6:C0 soll jeden Sonntag um 20 Uhr hochfahren. Ich werde leider aus dem Script nicht ganz schlau. Natürlich will ich nicht das mir das jetzt hier jemand fertig vorkaut weil möchte ja auch was lernen. Habe leider keine "kaum Erfahrungen" im scripten.

Letzte Frage wäre dann noch, wo füge ich das Script dann ein? Bei meinem Wake by Call habe ich es in /var/flash/calllog eingefügt!
 
Sleep bedeutet schlafen, oder in diesem Fall besser warten. Das Skript rechnet aus, wie lange es noch dauert (in Sekunden) bis zum gewünschten Zeitpunkt, und wartet dann solange.
Es gibt übrigens noch das praktische Format %s bei date, mit dem man das Skript viel einfacher machen kann.
Code:
# gewünschte Startzeit in Sekunden
START_S=$(date +%s -d "$TOSTART")
# aktuelle Zeit in Sekunden
NOW_S=$(date +%s)
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i $EW_IF $MAC ) &
Das Skript ruft die Aktion übrigens nur einmal auf.
Wenn man nur einmal pro Woche etwas tun will, muß man entweder mit den Wochentagen noch rechnen, oder jeden Tage ein Aktion ausführen, die aber selbst vorher noch den Wochentag prüft.
 
Hallo,
also so richtig werde ich aus dem Script nicht schlau. Wo trage ich die Mac Adresse ein des zu startenden Servers? Wo muss ich das Script auf der FritzBox ablegen?

Kannst du mir vielleicht ein Beispiel Script geben mit der Mac Adresse 00:C1:26:11:CA:01 das der Server jeden morgen um 10 Uhr startet. Daran erkennt ich vielleicht besser die Struktur des Scripts. Ich würde mich freuen!
 
Code:
TOSTART=10:00
EW_IF=lan
MAC=00:C1:26:11:CA:01
# gewünschte Startzeit in Sekunden
START_S=$(date +%s -d "$TOSTART")
# aktuelle Zeit in Sekunden
NOW_S=$(date +%s)
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i $EW_IF $MAC ) &
 
Hallo,
mal sehen ob ich alles verstanden habe. Wo ein "?" steht weiß ich es nicht da bitte ich um Hiflfe:)

Code:
TOSTART=10:00					--> Zeit wann der Server Starten soll
EW_IF=lan					-->ist egal ob lan oder eth0?
MAC=00:C1:26:11:CA:01				-->MAC Adresse vom zu startenden Server
# gewünschte Startzeit in Sekunden		-->Deklaration
START_S=$(date +%s -d "$TOSTART")		-->Hier wird errechnet wann er starten soll
# aktuelle Zeit in Sekunden			-->Deklaration
NOW_S=$(date +%s)				-->Jetzige Datum/Zeit
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then		-->Startzeit 10 Uhr vergleich mit jetziger Zeit
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))		-->Jeden Tag wiederholen
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))		-->??
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i $EW_IF $MAC ) & -->Ausführen des etherwakes Befehls

Wie mache ich das dann mit dem Server der nur jeden Sonntag um 20 Uhr starten soll? So?


Code:
TOSTART=20:00					--> Zeit wann der Server Starten soll
EW_IF=lan					-->ist egal ob lan oder eth0?
MAC=00:C1:26:11:CA:B1				-->MAC Adresse vom zu startenden Server
# gewünschte Startzeit in Sekunden		-->Deklaration
START_S=$(date +%s -d "$TOSTART")		-->Hier wird errechnet wann er starten soll
# aktuelle Zeit in Sekunden			-->Deklaration
NOW_S=$(date +%s)				-->Jetzige Datum/Zeit
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then		-->Startzeit 10 Uhr vergleich mit jetziger Zeit
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))	
    START_S=$(( START_S + 24*60*60))	 
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))		-->??
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i $EW_IF $MAC ) & -->Ausführen des etherwakes Befehls

Ist das so richtig? Oder total falsch?
 
Wie genau der Befehl zum Aufwecken lauten muß, probierst Du am Besten aus, bevor Du Dir Gedanken darüber machst, wie Du es zu einer bestimmten Zeit erreichen kannst.

Die Zeilen, die mit '#' anfangen, sind keine Deklarationen, sondern Kommentare. Diese sollten eigentlich erläutern, was die folgende(n) Zeilen machen.

Also:
Gewünschte Startzeit in Sekunden, z.B. heute 10 Uhr.
Aktuelle Zeit in Sekunden, z.B. heute, 16 Uhr.
Ein Start heute um 10 Uhr ist daher nicht mehr möglich. Also werden zur Startzeit 24*60*60 = 24 Stunden = 1 Tag dazu gezählt. Startzeit ist jetzt morgen 10 Uhr. Die Startzeit liegt damit auf jeden Fall in der Zukunft.
Danach wird die Differenz zischen Startzeit und aktueller Zeit berechnet, in Sekunden: START_S - NOW_S.
Danach wird eine entsprechende Anzahl Sekunden gewartet und dann die gewünschte Aktion ausgeführt.

Bei der wöchentlichen Ausführung kannst Du nicht einfach 6-mal einen Tag dazu zählen. Du mußt erst feststellen, welcher Wochentag heute ist, und dann entsprechend viele Tage dazuzählen, damit der von Dir gewünschte Wochentag herauskommt.

Und außerdem mußt Du das Ganze noch in eine Schleife packen, damit es nicht nur einmal ausgeführt wird.

Das Beispiel oben stammt von einer Lösung, um die Box zu einem bestimmten Zeitpunkt zu rebooten. Da kommt es natürlich nicht darauf an, die Aktion mehrmals auszuführen, weil durch den Reboot sowieso alles beendet wird.
 
Hallo,
hoffe hab es jetzt richtig! Dieser Server soll jetzt jeden morgen um 10 Uhr hochfahren!

Code:
´TOSTART=10:00
EW_IF=th0
MAC=00:C1:26:11:CA:01
# gewünschte Startzeit in Sekunden
START_S=$(date +%s -d "$TOSTART")
# aktuelle Zeit in Sekunden
NOW_S=$(date +%s)
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i eth0 $EW_IF $MAC ) &

Der zweite Server sollte jeden Sonntag um 20 Uhr hochfahren. Da heute Montag ist habe ich 6 Tage hinzugefügt bis zum Start!

Code:
TOSTART=20:00
EW_IF=th0
MAC=00:24:8C:51:B6:C0
# gewünschte Startzeit in Sekunden
START_S=$(date +%s -d "$TOSTART")
# aktuelle Zeit in Sekunden
NOW_S=$(date +%s)
# Startzeit schon vorbei?
if test "$START_S" -le "$NOW_S"; then
    # einen Tag dazu zählen
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
    START_S=$(( START_S + 24*60*60))
fi
# Wie lange warten?
SEC_TO_SLEEP=$(( START_S - NOW_S ))
# Warten und Aktion ausführen, asynchron
(sleep $SEC_TO_SLEEP ; ether-wake -i eth0 $EW_IF $MAC ) &

Ist das so richtig?
Wie mache ich die Schleife, mit dem "&"?
Wo muss ich das Script genau einfügen auf der Fritzbox?
 
Nein ;-)
Indem du eine "unendliche Schleife" drum machst
Erstmal testen, dann vielleicht in der "/var/flash/debug.cfg"??


Etwas genauer:
Fehler sind (ohne Anspruch auf Vollständigkeit):
- Das ' am Anfang vor dem TOSTART (wohl ein Copy-Paste Fehler)
- Lass das Interface weg (EW_IF) oder trage es richtig ein (eth0)
- Im ether-wake aufruf nur eins angeben: direkt das Interface oder den Platzhalter ($EW_IF)
- Das "Immer Sonntags" Skript geht so nicht, du musst den aktuellen Tag wissen, um die Differenz berechnen zu können. Alternative: Einmal am bekannten Tag starten, danach einfach immer genau 7 Tage Warten, das sollte (in etwa, je nach Genauigkeit) hinkommen.


Eine Unendliche Schleife wäre z.B.:
Code:
while [ 1 ] ; do 
    #mach was
done

Teste erstmal die direkte Eingabe, (Start in 5 Minuten oder so) und wenn es dann geht, kannst du es "resetfest" machen. Das sollte auf jeden Fall dann im Hintergrund laufen, um nicht irgendwas zu blockieren...

Jörg
 
Da heute Montag ist habe ich 6 Tage hinzugefügt bis zum Start

Heute ist Montag. Und wenn Du die Box das nächste Mal startest, ist vielleicht Mittwoch. Sollen dann auch 6 Tage dazu gezählt werden?

Code:
TOSTART=10:00
EW_IF=lan
MAC=00:C1:26:11:CA:01
while true; do
    # gewünschte Startzeit in Sekunden
    START_S=$(date +%s -d "$TOSTART")
    # aktuelle Zeit in Sekunden
    NOW_S=$(date +%s)
    # Startzeit schon vorbei?
    if test "$START_S" -le "$NOW_S"; then
        # einen Tag dazu zählen
        START_S=$(( START_S + 24*60*60))
    fi
    # Wie lange warten?
    SEC_TO_SLEEP=$(( START_S - NOW_S ))
    # Warten
    sleep $SEC_TO_SLEEP
    # Aktion ausführen
    ether-wake -i $EW_IF $MAC
done

Code:
TOSTART=20:00
EW_IF=lan
MAC=00:C1:26:11:CA:01
while true; do
    # gewünschte Startzeit in Sekunden
    START_S=$(date +%s -d "$TOSTART")
    # aktuelle Zeit in Sekunden
    NOW_S=$(date +%s)
    NOW_W=$(date +%w)
    # Startzeit am gewünschten Wochentag
    START_S=$(( START_S + 24*60*60*((7 - NOW_W) % 7) ))
    # Startzeit schon vorbei?
    if test "$START_S" -le "$NOW_S"; then
        # eine Woche dazu zählen
        START_S=$(( START_S + 7*24*60*60))
    fi
    # Wie lange warten?
    SEC_TO_SLEEP=$(( START_S - NOW_S ))
    # Warten
    sleep $SEC_TO_SLEEP
    # Aktion ausführen
    ether-wake -i $EW_IF $MAC
done
 
Hallo,
danke für den Code. Ich probiere das jetzt mal aus. So wie ich es jetzt verstanden habe ist es wie folgt.

Beim ersten Code ist es egal wann ich die Box neustarte der Server startet jeden Tag um 10 Uhr. Beim zweiten Code den müssen ich am Sonntag einfügen und dürfte rein theoretisch die Box nicht durchstarten. Ist das richtig? Das ganze lege ich dann hier ab "/var/flash/debug.cfg" also mit in die cfg oder gibt es dafür einen besseren Ort? Seit mir nicht bös wenn ich es falsch habe :(
 
Da Du vorher nicht wissen kannst, wann die Box neu gestartet wird, muß das Skript mit jedem Tag zurecht kommen. Dafür sind diese Zeilen zuständig:
Code:
    # Den aktuellen Wochentag bestimmen (0=Sonntag, ..., 6=Samstag)
    NOW_W=$(date +%w)
    # Startzeit am gewünschten Wochentag
    # Tage bis zum gewünschten Wochentag: 7 für Sonntag minus heutiger Wochentag.
    START_S=$(( START_S + 24*60*60*((7 - NOW_W) % 7) ))
NOW_W enthält den heutigen Wochentag. Von heute bis Sonntag sind es (7-NOW_W) Tage. Wenn heute Sonntag ist, ist das Ergebnis 7. In 7 Tagen ist dann zwar auch wieder Sonntag, aber das ist hier nicht gewünscht, deswegen die die Differenz modulo 7 genommen. Es werden also bei Sonntag 0 Tage dazugezählt, bei Montag 6 Tage, ..., bei Samstag 1 Tag. Wenn aber heute Sonntag ist und die Zeit bereits vorbei ist, dann wird eine ganze Woche dazugezählt, auf Sonntag nächste Woche.

Du kannst das, so wie es ist, in die debug.cfg schreiben, wenn Du jeweils hinter "done" noch ein " &" einfügst.
 
Hallo,
also erstmal vielen vielen Dank! Ich denke ich habe es jetzt verstanden. Das heißt für mich ich kann folgendes Script verwenden das der Server 1 der jeden Tag starten soll...

Code:
TOSTART=10:00
EW_IF=lan
MAC=00:C1:26:11:CA:01
while true; do
    # gewünschte Startzeit in Sekunden
    START_S=$(date +%s -d "$TOSTART")
    # aktuelle Zeit in Sekunden
    NOW_S=$(date +%s)
    # Startzeit schon vorbei?
    if test "$START_S" -le "$NOW_S"; then
        # einen Tag dazu zählen
        START_S=$(( START_S + 24*60*60))
    fi
    # Wie lange warten?
    SEC_TO_SLEEP=$(( START_S - NOW_S ))
    # Warten
    sleep $SEC_TO_SLEEP
    # Aktion ausführen
    ether-wake -i $EW_IF $MAC
done &


Und für den Server 2 der jeden Sonntag um 20 Uhr starten soll ...

Code:
TOSTART=20:00
EW_IF=lan
MAC=00:C1:26:11:CA:01
while true; do
    # gewünschte Startzeit in Sekunden
    START_S=$(date +%s -d "$TOSTART")
    # aktuelle Zeit in Sekunden
    NOW_S=$(date +%s)
    NOW_W=$(date +%w)
    # Startzeit am gewünschten Wochentag
    START_S=$(( START_S + 24*60*60*((7 - NOW_W) % 7) ))
    # Startzeit schon vorbei?
    if test "$START_S" -le "$NOW_S"; then
        # eine Woche dazu zählen
        START_S=$(( START_S + 7*24*60*60))
    fi
    # Wie lange warten?
    SEC_TO_SLEEP=$(( START_S - NOW_S ))
    # Warten
    sleep $SEC_TO_SLEEP
    # Aktion ausführen
    ether-wake -i $EW_IF $MAC
done &

Ich kann auch meine Box rebooten wie ich lustig bin er bekommt es immer hin "eigentlich" richtig?

Was nur ein kleines Fragenzeichen bei mir noch ist wofür ist das "&" als Schleife? Wenn ja was bewirkt die Schleife?
 
Das & bewirkt, daß die Schleife im Hintergrund ausgeführt wird und parallel die Anweisungen ausgeführt werden, die nach der Schleife kommen.
So kannst Du beide Teile in die debug.cfg hintereinander einfügen, beide Teile werden ausgeführt, und die debug.cfg wird beendet, so daß das, was danach kommt, auch noch ausgeführt wird.
 
Hallo,
vielen Dank für die Erklärungen! Eine Abschließende Frage noch! Ich kann meine FritzBox restarten wie ich will das Script wird immer ausgeführt zu den bestimmten Zeitpunkten! Korrekt?
 
Das Skript wird sofort beim Start ausgeführt. Es rechnet dann aus, wie lange es warten soll, wartet, und startet dann die gewünschte Aktion. Und dann geht das Ganze wieder von vorne los, für den nächsten Tag bzw. die nächste Woche.
 
Hallo,
habe das erste Script gerade mal eingefügt zum Testen

Code:
TOSTART=18:45
EW_IF=lan
MAC=00:24:8C:51:B6:C0
while true; do
    # gewünschte Startzeit in Sekunden
    START_S=$(date +%s -d "$TOSTART")
    # aktuelle Zeit in Sekunden
    NOW_S=$(date +%s)
    # Startzeit schon vorbei?
    if test "$START_S" -le "$NOW_S"; then
        # einen Tag dazu zählen
        START_S=$(( START_S + 24*60*60))
    fi
    # Wie lange warten?
    SEC_TO_SLEEP=$(( START_S - NOW_S ))
    # Warten
    sleep $SEC_TO_SLEEP
    # Aktion ausführen
    ether-wake -i $EW_IF $MAC
done &
Und jetzt postet er mir folgenden Fehler die ganze Zeit und ich weiß nicht wie ich es unterbrechen kann...


Code:
# /etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090862'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090862'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090863'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090864'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: hlen: not found
sleep: invalid number '-1271090864'
/etc/init.d/rc.S: /var/flash/debug.cfg: line 21: nschte: not found
date: invalid date ''

Brauche bitte erneut Hilfe:) Danke!
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.