Função de chamada em intervalos de tempo específicos no Linux
Pergunta
Qual é a melhor maneira de chamar uma função dentro de um daemon Linux em intervalos de tempo específicos e horário específico (por exemplo, às 12h todos os dias, chame essa função). Não estou me referindo a chamar um processo com Crontab, mas uma função dentro de um daemon de longa duração.
Obrigado
Solução
Use o settimer com Itimer_real e peça à sua função chamada pelo manipulador para SigalarMr.
Outras dicas
Das suas tags de perguntas, eu entendo que você está executando um daemon da Shell. Portanto, minha sugestão é usar o Crontab, pois já está esperando para ser usado, para sinalizar seu daemon.
Em seu daemon da concha, você precisa de um manipulador de sinal
handler() {
echo "$(date): doing something special" >> $LOG
}
você tem que prender um sinal, sigalrm neste exemplo
trap handler ALRM
e em seu crontab enviar o sinal, assumindo que seu daemon seja daemon.sh
0 0 * * * killall -s SIGALRM daemon.sh
Compare o horário atual com o tempo em que você deve estar em execução e, se for posteriormente na execução, e depois redefine o tempo.
Meu truque favorito é:
- Durma e acorde a cada enésimo segundos (eu pessoalmente prefiro a cada segundo ou a cada 10 segundos)
- Quando acorde, verifique a hora e verifique se eu preciso executar alguma coisa
- Enxágue, repita ...
Como você faz isso depende do seu idioma. Em TCL, eu faria 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!