1 votes

Les tâches Cron accèdent au même fichier statique

J'essaie de mettre en place deux tâches cron distinctes qui accèdent au même fichier statique. L'une des tâches s'exécute toutes les minutes, en agrégeant les nouvelles données qui sont arrivées dans le fichier. La seconde tâche s'exécute toutes les 30 minutes, analysant les données agrégées et tronquant le fichier pour le réinitialiser pour les 30 prochaines minutes.

Il est évident qu'il y a un risque de blocage toutes les 30 minutes. Existe-t-il un moyen d'écrire la tâche cron pour la première tâche de sorte qu'elle ne s'exécute que toutes les minutes pendant 29 minutes (sans énumérer toutes les minutes 1 à 60, à l'exception des 30 et 60), puis recommence à la minute 31 ? Merci !

Editar

A la demande, j'utilise PHP pour effectuer ces opérations (puisqu'il y a une utilisation importante de structures de données). J'ai implémenté l'utilisation de la fonction flock et alors que la fonction documentation de la fonction spécifie que l'appel est bloqué jusqu'à ce que 1) le verrou soit obtenu, ou 2) l'option LOCK_NB est spécifiée, j'ai été confus par le fait que l'exemple suivant semble impliquer qu'il est possible de ne pas obtenir le verrou, même avec un appel bloquant.

A moins que cela ne soit dû à un autre problème (permissions, interruptions du système d'exploitation, etc) ? Ce problème de blocage jusqu'à l'obtention d'un verrou était vraiment la motivation de ma question, pour voir s'il y avait un autre moyen d'éviter complètement le verrouillage des fichiers, atténuant ainsi le risque qu'une tentative de verrouillage non bloquante échoue et que le script s'arrête.

2voto

Matthieu Riegler Points 20160

Vous ne voulez pas faire cela ; la seule fois où votre travail prend plus d'une minute, vous allez vous faire avoir. Des conditions de course de ce type créent de vilains problèmes : intermittents, imprévisibles et difficiles à diagnostiquer.

Pboin a tout à fait raison : vous devez explorer l'utilisation de la technologie de l'information. sémaphore dans votre code, et le problème disparaît, et vous n'avez plus à vous soucier des conflits d'horaires.

Quelle langue utilisez-vous ?

Editar (désolé pour le php, je ne l'ai pas utilisé depuis un moment, et je suis un peu ivre, donc il se peut qu'il ne compile pas) :

La tactique "habituelle" avec le verrouillage est de vérifier s'il y a un verrou (ce que je fais dans ce cas en essayant d'en obtenir un), et s'il y en a un, d'implémenter une courte attente et de réessayer. Vous pouvez essayer d'utiliser la fonction sleep() de php à l'intérieur d'une boucle while, par ex :

while($x){
    if(flock($file_handle, LOCK_EX)){
        $x = false;
    }else{
        sleep(5);
        $x = true;
    }
}

J'utilise quelque chose de similaire pour des tonnes de travaux d'écriture basés sur des cron. Ça marche du tonnerre. Il s'agit en fait d'une méthode similaire au protocole de communication ALOHA, qui est très proche d'un protocole réseau ultérieur appelé "TCP/IP". Essayez, essayez, et essayez encore.

1voto

pboin Points 1086

Eh bien, vous pourriez énumérer vos minutes dans cron comme vous le suggérez, mais cela ne résout pas vraiment le problème. (D'une part, cron ne garantit pas l'exécution dans une minute donnée).

Vous feriez probablement mieux d'implémenter une fonctionnalité de verrouillage dans votre script -- c'est beaucoup moins un hack. Le site Guide avancé du script Bash une ressource excellente et gratuite suggère le lockfile qui vous aidera à le faire.

Vous aurez beaucoup moins de soucis à vous faire en faisant cela correctement.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X