Función de llamada a intervalos de tiempo específicos en Linux
Pregunta
¿Cuál es la mejor manera de llamar a una función dentro de un demonio de Linux a intervalos de tiempo específicos y un tiempo específico (por ejemplo, a las 12 am todos los días, llame a esta función)? No me refiero a llamar a un proceso con Crontab, sino una función dentro de un demonio de larga duración.
Gracias
Solución
Use Settimer con ITIMER_REAL y haga que su función sea llamado por el controlador para Sigalarm.
Otros consejos
De sus etiquetas de preguntas, entiendo que está ejecutando un Daemon de Shell. Entonces, mi sugerencia es usar crontab, ya que ya está esperando ser usado, para indicarle a su demonio.
En el demonio de su carcasa necesitas un manejador de señal
handler() {
echo "$(date): doing something special" >> $LOG
}
Tienes que atrapar una señal, sigalrm en este ejemplo
trap handler ALRM
Y en su crontab envíe la señal, suponiendo que su demonio sea demonio.
0 0 * * * killall -s SIGALRM daemon.sh
Compare la hora actual con el tiempo que debe estar ejecutando, y si es más tarde que se ejecuta y luego restablezca la hora.
Mi truco favorito es:
- Duerme y desperté cada en segundo lugar (personalmente prefiero cada segundo o cada 10 segundos)
- Cuando se despierte, verifique la hora y verifique si necesito ejecutar algo
- Enjuague, repita ...
Cómo haces esto depende de tu idioma. En TCL haría algo como:
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!