2010-01-27 4 views
1

Quelle est la meilleure façon d'appeler une fonction dans un démon Linux à des intervalles de temps spécifiques et à une heure spécifique (par exemple, à 12h00 tous les jours, appelez cette fonction). Je ne parle pas d'appeler un processus avec crontab, mais une fonction dans un démon de longue durée.Fonction d'appel à des intervalles de temps spécifiques sous Linux

Merci

+1

quel langage de programmation? – Kimvais

+0

le langage est C/C++ – bob

Répondre

1

utilisez settimer avec ITIMER_REAL et que votre fonction soit appelée par le gestionnaire pour SIGALARM.

+0

J'ai lu quelque part: "Vous ne devriez pas compter sur le signal arrivant précisément quand le temporisateur expire.Dans un environnement multitraitement, il y a généralement un certain retard." Est-il possible de déclencher l'appel de fonction précisément dans le temps? J'ai le même démon fonctionnant sur plusieurs machines différentes, et je voudrais les faire déclencher l'appel de fonction à la fois (dans une seconde) – bob

0

Comparez l'heure actuelle au moment où vous devez exécuter, et si elle est plus tard que de courir, puis remis à zéro le temps.

0

Mon truc préféré est:

  • dormir et se réveiller toutes les secondes Nième (Personnellement, je préfère soit tous les deux ou toutes les 10 secondes)
  • quand réveillé vérifier l'heure et vérifiez si je dois exécuter quoi que ce soit
  • rincer, répéter ...

Comment vous faites cela dépend de votre langue. En tcl je ferais quelque chose comme:

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! 
1

De vos balises de question je comprends que vous exécutez un démon shell. Donc, ma suggestion est d'utiliser crontab, car il est déjà en attente d'être utilisé, pour signaler votre démon.

Dans votre démon shell vous avez besoin d'un gestionnaire de signaux

handler() { 
     echo "$(date): doing something special" >> $LOG 
    } 

vous de piéger un signal, SIGALRM dans cet exemple

trap handler ALRM 

et dans votre crontab envoyer le signal, en supposant que votre démon est daemon.sh

0 0 * * * killall -s SIGALRM daemon.sh 
Questions connexes