Anruffunktion in bestimmten Zeitintervallen unter Linux
Frage
Was ist der beste Weg, um eine Funktion in einem Linux -Daemon in bestimmten Zeitintervallen und zu einer bestimmten Zeit aufzurufen (z. B. täglich um 12 Uhr morgens, nennen Sie diese Funktion). Ich beziehe mich nicht darauf, einen Prozess mit Crontab aufzurufen, sondern eine Funktion innerhalb eines langjährigen Daemons.
Vielen Dank
Lösung
Verwenden Sie SetTimer mit itimer_real und lassen Sie Ihre Funktion vom Handler für Sigalarm aufgerufen.
Andere Tipps
Ich verstehe, dass Sie einen Shell -Daemon ausführen. Mein Vorschlag ist also, Crontab zu verwenden, da es bereits darauf wartet, verwendet zu werden, um Ihren Daemon zu signalisieren.
In Ihrem Shell -Daemon benötigen Sie einen Signalhandler
handler() {
echo "$(date): doing something special" >> $LOG
}
Sie müssen ein Signal, Sigalrm in diesem Beispiel
trap handler ALRM
Und in Ihrem Crontab senden Sie das Signal, vorausgesetzt, Ihr Daemon ist Daemon.sh
0 0 * * * killall -s SIGALRM daemon.sh
Vergleichen Sie die aktuelle Zeit mit der Zeit, in der Sie ausgeführt werden sollten, und wenn sie später als ausgeführt ist, und dann die Zeit zurücksetzen.
Mein Lieblingstrick ist:
- Schlaf und wecke alle n -ten Sekunden (ich persönlich bevorzuge entweder jede Sekunde oder alle 10 Sekunden)
- Wenn Sie aufgeweckt sind, überprüfen Sie die Zeit und prüfen Sie, ob ich etwas ausführen muss
- Spülen, wiederholen ...
Wie Sie dies tun, hängt von Ihrer Sprache ab. In TCL würde ich so etwas tun wie:
proc scheduler {} {
global task_list
set now [clock format [clock seconds] -format "%H:%M"]
foreach task $task_list {
lassign $task_list time task
if {$time == $now} {
apply $task
}
}
after 1000 scheduler ;# repeat after 1 second
}
scheduler ;# GO!