Zeitgesteuerter Neustart, aber warum nur einmal?

raffix

Neuer User
Mitglied seit
1 Jul 2005
Beiträge
41
Punkte für Reaktionen
0
Punkte
0
Erstmal hallo an alle Beitragsleser,

meine Frage ist recht kurz und zwar habe ich einen Befehl in die debug.cfg eingefügt, der alle 24 Std. zu einer bestimmten Zeit die Box neustarten sollte.
Er sieht folgendermaßen aus:

Code:
await() {
local day=$((60*60*24))
sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
(sleep 600; await 0330; reboot) &

Nun tut er das auch, also er startet die Box um 3:30 Uhr tatsächlich neu. Nur und das verstehe ich überhaupt nicht, an den darauffolgenden Tagen eben nicht mehr.
D.h. der Neustart funktioniert nur einmal. Das würde aber bedeuten, dass bei dem Befehl "reboot" die debug.cfg nicht neu ausgelesen wird, was aber eigentlich doch IMMER der Fall sein sollte?!
Also warum funktioniert der obige Befehl einmal, wenn ich die Box per Webinterface von Hand neustarte oder auch wenn ich den Stecker ziehe, aber warum klappt es nicht mehr, wenn der Reboot einmal zeitgesteuert ausgelöst wurde?

Wäre echt super, wenn da irgendjemand eine Idee hätte, wie man das lösen kann. Denn es bedeutet natürlich auch, dass alle anderen zeitgesteuerten Befehle Probleme machen können.

MfG
raffix
 
Zuletzt bearbeitet:
Hallo!

Hast du evtl. noch den LCR mit auf der box laufen. In Verbindung mit diesem hat es bei mir auch nicht geklappt. Vielleicht weil dann Sleep 2x läuft?
 
Nun tut er das auch, also er startet die Box um 3:30 Uhr tatsächlich neu.
Hat er das bereits aus der debug.cfg beim Hochfahren gestartet oder hast du das "von Hand" gemacht?
Interessant wäre ein "ps" von der Box um zu sehen, ob der Befehl da ist. Ich hatte hier auch schonmal vorgeschlagen, das "sleep" durch das "Warten innerhalb des reboot" zu ersetzen. Kannst du ja mal versuchen, ob das besser geht:

Code:
awaitreboot() {
local day=$((60*60*24))
reboot -d $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
(sleep 600; awaitreboot 0230) &

Jörg
 
Vielen Dank für die Hinweise.
Der Reboot wurde bei mir nicht von Hand, sondern aus der debug.cfg ausgelöst.
Im Klartext: Wenn ich die Box neustarte, durch Befehl im Webinterface oder durch Stecker ziehen, wird der in der debug.cfg eingetragene Reboot-Befehl ausgeführt. Nachdem dieser Befehl allerdings dann einmal ausgeführt wurde, erfolgen keine Neustarts mehr.
Ich denke, jetzt dürfte es klarer sein.
Den angehängten Code kann ich leider erst in einiger Zeit testen, weil ich zurzeit nicht vor Ort bin, werde das aber auf jedenfall tun (und hier berichten)!!
 
Meine Vermutung ist übrigens, dass das "direkt" nur funktioniert hat, weil du "nah genug" an der Zeit warst, als du das von Hand initiiert hast (das "sleep" braucht ja bei dem Reboot um 3:30 fast 24h also 86400 Sekunden) und ich vermute, da gibt es einen Überlauf. Deshalb könntest du auch mal versuchen, das mit Minuten zu testen (das sind nur 1440 ;-)):
Code:
await() {
local day=$((60*60*24))
sec2time=$(( ($(date -d $(date +%m%d$1%Y) +%s)  - $(date +%s) + $day) % $day ))
min2time="$(( $sec_to_time / 60 ))m"
sleep $min2time
}
(sleep 600; await 0330; reboot) &

Jörg
 
Mal eine Rückmeldung von mir: Das "awaitreboot" (bei dem reboot verzögert ist) funzt mit den >86.000 Sekunden auch nicht...

Ich teste jetzt gerade meinen Vorschlag, "sleep mit Minuten" (bei mir steht nun "sleep 1437m " im "ps"). Melde mich morgen, ob es geklappt hat...

Jörg
 
Wenn es wirklich an dem Sleep liegt, und auch das Sleep in Minuten Probleme macht, könnte man als quick & dirty-Lösung auch mehrere Sleeps in Reihe schalten... Also in etwa so:

Code:
await() {
local day=$((60*60*24))
sleep $(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
}
(sleep 4h;sleep 4h; sleep 4h;sleep 4h; await 0330; reboot) &

Damit dürfte es zummindest schon mal keinen Überlauf mehr bei den sleeps geben... Ich denke mal 8 Stunden (beim await) müssten die am Stück können...

Ist jetzt allerdings das Problem, wenn das letzten "sleep 4h" genau um kurz nach 3:30 endet... Dann hätten wir wieder das gleiche Problem wie am Anfang...

Gruss.
 
Versuch es mal mit:
Code:
( sleep 600; await 0330; reboot ) &
Auch Leerzeichen haben oft eine nicht unwesentliche Bedeutung! ;)
 
Also, was soll denn an welchen Leerzeichen falsch gewesen sein??

Das ganze funktioniert ja auch im Prinzip, nur das "sleep" scheint mit den großen Werten nicht zu funktionieren, und mein folgendes Skript tut es auch...

Ich habe zum Testen, um zu sehen was passiert, dieses Skript mit vielen Ausgaben und "Speicherung" im ds-mod gebaut, das funzt schonmal, so dass man ohne die Ausgaben schonmal was hätte...
Code:
awaitreboot() {
local day=$((60*60*24))
sec_to_time=$(( ($(date -d $(date +%m%d$1%Y) +%s) - $(date +%s) + $day) % $day ))
date +"START - %d.%m. %H:%M - START" > /var/tmp/sleepout
min2time="$(( $sec_to_time / 60 ))"
echo "sleeping  ${min2time}minutes"
tosleep=$(( ${min2time} / 60 ))
while [ $tosleep -ge 1 ]
  do
  	echo "`date +"%d.%m. %H:%M"` - Sleeping 1 Hour. tosleep=$tosleep." >> /var/tmp/sleepout
  	sleep 1h
  	tosleep=$(( $tosleep-1 ))
  done

rest=$(( ${min2time} % 60 ))
echo "`date +"%d.%m. %H:%M"` - Sleeping rest=$rest." >> /var/tmp/sleepout
sleep ${rest}m
echo "`date +"%d.%m. %H:%M"` - Requesting reboot" >> /var/tmp/sleepout
cp  /var/tmp/sleepout  /var/tmp/flash/sleepout
modsave
reboot
}
(sleep 100; awaitreboot 1800) &
Ich werde die Stunden jetzt mal zusammenfassen und dann berichten...


Jörg
 
So,
ich melde mich mal nochmal. Mein Stand ist:

Ein sleep mit 10 Stunden ("sleep 10h") geht noch, einer mit 12 Stunden nicht (der läuft nun schon 26 Stunden :-( ). Ich weiß zwar nicht, wo es letztlich hängt, aber zumindest bleibt z.B. diese funktionsfähige Version für einen "zeitgesteuerten Reboot":

Code:
awaitreboot() {
local day=$((60*60*24))
sec2time=$(( ($(date -d $(date +%m%d$1%Y) +%s) -  $(date +%s) + $day) % $day ))
min2time="$(( $sec2time / 60 ))"
# Erstmal die Stunden in 10-er Intervalls "abschlafen" ....
tosleep=$(( ${min2time} / 60 ))
while [ $tosleep -ge 10 ]
  do
  	sleep 10h
  	tosleep=$(( $tosleep-10 ))
  done
# ... dann die Reststunden schlafen ...
sleep ${tosleep}h
# ... und zuletzt die letzten Minuten schlafen ...
rest=$(( ${min2time} % 60 ))
sleep ${rest}m
#  ... und die Box neu starten
reboot
}
(sleep 600; awaitreboot 0230) &


Jörg
 
Hallo Jörg,

teste gerade dein letztes Skript über die nächsten Nächte und werde mein Ergebnis dann hier posten. Ist mittlerweile schon ein Grund gefunden worden, warum ein Sleep über eine längere Zeitdauer nicht funktioniert?

Gruß
Raffix
 
Teste es auch grade mal...

ACHTUNG: Funktioniert nicht auf der FBF 5140!!!

Die FBF 5140 kennt den Sleep-Befehl nur in Sekunden!
Ein sleep 5m z.B. funktioniert da nicht!!!

Dann macht die Box alle 5 Minuten (600 Sekunden) ein Neustart!

Desweiteren bringt ein "reboot" meist keinen reboot sondern ein Shutdown... Warum auch immer...

Abhilfe bringt es in der debug.cfg folgendes einzutragen:
Code:
PATH=/var/bin:/bin:/usr/bin:/sbin:/usr/sbin

LED_DEVICE=/proc/led_mod/led
if [ ! -f /proc/led_mod/led  ] ; then
  LED_DEVICE=/var/led
  echo "set led: ${LED_DEVICE}"
fi
# start internet phone led flashing
echo "set internet phone led to blink (modul=14, state=3)"
echo 14,3 > ${LED_DEVICE}

# check kernel version
KERNEL_VERSION=`uname -r | grep 2.6`
if [ -z "${KERNEL_VERSION}" ]
then
  KERNEL_VERSION="linux24"
  ETHERWAKE="etherwake"
else
  KERNEL_VERSION="linux26"
  ETHERWAKE="ether-wake"
fi

# init busybox var
BUSYBOX="/bin/busybox"

if [ -z "$(busybox | grep telnetd)" ]
then
  while !(ping -c 1 ftp.the-construct.com)
  do
    sleep 5
  done
  # check if file already exists
  if [ ! -f /var/tmp/busybox ]
  then
    wget -qO /var/tmp/busybox http://ftp.the-construct.com/files/${KERNEL_VERSION}/busybox
    # make it executable
    chmod +x /var/tmp/busybox
  fi
  # set busybox var
  BUSYBOX="/var/tmp/busybox"
fi

mkdir /var/bin
ln /var/tmp/busybox /var/bin/reboot -s
ln /var/tmp/busybox /var/bin/sleep -s

# stop internet phone led flashing
echo 14,1 > ${LED_DEVICE}


# Automatischer Reset
awaitreboot() {
local day=$((60*60*24))
sec2time=$(( ($(date -d $(date +%m%d$1%Y) +%s) -  $(date +%s) + $day) % $day ))
min2time="$(( $sec2time / 60 ))"
# Erstmal die Stunden in 10-er Intervalls "abschlafen" ....
tosleep=$(( ${min2time} / 60 ))
while [ $tosleep -ge 10 ]
  do
        sleep 10h
        tosleep=$(( $tosleep-10 ))
  done
# ... dann die Reststunden schlafen ...
sleep ${tosleep}h
# ... und zuletzt die letzten Minuten schlafen ...
rest=$(( ${min2time} % 60 ))
sleep ${rest}m
#  ... und die Box neu starten
/var/bin/reboot
}
(sleep 600; awaitreboot 0437) &

Dann scheint es auch zu funktionieren...

Mal den Langzeittest abwarten...

Gruss.
 
Bei mir ist eine 7050 im Einsatz, doch der Code von Maxmuster funktioniert leider nicht.
Die Box hat jedenfalls keinen Reboot durchgeführt letzte Nacht.
Jetzt hoffe ich auf eine Korrektur... oder probiere den von do1fmd
 
Hi raffix,

was sagt denn ein "ps" bei dir?
Eventuell gilt auch bei dir, dass die Box nur "Sekunden" schlafen kann. Dann könntest du das natürlich abgewandelt mit "sleep 36000" statt sleep 10h usw. versuchen (das sleep rechnet soweit ich das mal verfolgt habe das intern sowieso in Sekunden um):

Code:
awaitreboot() {
local day=$((60*60*24))
date +"START - %d.%m. %H:%M - START" > /var/tmp/sleepout
tosleep=$(( ($(date -d $(date +%m%d$1%Y) +%s) -  $(date +%s) + $day) % $day ))
while [ $tosleep -ge 36000 ]
  do
        echo "`date +"%d.%m. %H:%M"` - Sleeping 36000 Seconds. tosleep=$tosleep." >> /var/tmp/sleepout
  	sleep 36000
  	tosleep=$(( $tosleep - 36000 ))
  done
# ... dann die Rest-Sekunden schlafen ...
echo "`date +"%d.%m. %H:%M"` - Sleeping rest=$tosleep Seconds." >> /var/tmp/sleepout
sleep ${tosleep}
#  ... und die Box neu starten
echo "`date +"%d.%m. %H:%M"` - Requesting reboot" >> /var/tmp/sleepout
reboot
}
(sleep 600; awaitreboot 0230) &

So, habe noch ein paar "Ausgaben" mit eingefügt, damit man in "/var/tmp/sleepout" sehen kann, was so passiert ist (und was nicht)..

Jörg
 
Zuletzt bearbeitet:
Hi Jörg,

ein "ps" hat mir kein Sleep angezeigt, aber mit deiner letzten Lösung hat es funktioniert. Es wurden heute auch schon brav 10 Std. abgeschlafen und die nächsten 10 Std. begonnen. So wie es aussieht, funktioniert dein letztes Skript. Werde das jetzt mal noch die folgenden beiden Tage testen, auch wenn ich glaube, dass das Problem damit gelöst sein wird.
Gute Idee da ein Protokoll mit einzubauen!

Auch wenn das Topic noch nicht geschlossen ist, schon mal vielen Dank für die Hilfe!

raffix
 
So wie es aussieht, funktioniert das Skript von MaxMuster.
Saubere Arbeit. Nochmals an dieser Stelle herzlichen Dank!!!

Gruß
raffix
 
So, habe mal mein Script getestet...

Das funktioniert auch.

Läd eben die Busybox von the-construct runter... (weche deutlichst mehr Befehle beinhaltet, als die eingebaute busybox)

Gruss, do1fmd.
 
Läd eben die Busybox von the-construct runter...
Na dann gibt es ja sogar mehr Lösungen.
Aber "lohnen" tut sich der "Aufwand" meines Erachtens eigentlich nur, wenn man die Busybox noch für was anderes benutzt, denn letztlich ist das mit "m", "h" und "d" nicht mehr als ein "internes Umrechnen" in Sekunden im "sleep" der Busybox. Ausschnitt aus sleep.c:
Code:
#if ENABLE_FEATURE_FANCY_SLEEP
static const struct suffix_mult sfx[] = {
	{ "s", 1 },
	{ "m", 60 },
	{ "h", 60*60 },
	{ "d", 24*60*60 },
	{ }
};
#endif
das könnte man bei Bedarf auch "selbst machen" ;-).

@raffix: Wenns jetzt läuft, solltest du zur Klarheit ein "[gelöst]" oder so vor den Titel schreiben (erster Beitrag, Ändern->Erweitert).

Jörg
 
Kostenlos!

Statistik des Forums

Themen
248,531
Beiträge
2,293,668
Mitglieder
378,035
Neuestes Mitglied
sr0211