3 votes

Distribution de la charge utile à plusieurs tâches cron

J'ai un shell script qui dit data.sh . Pour que ce script s'exécute je vais passer un seul argument disons Table_1.

J'ai un fichier de test que j'obtiendrai à la suite d'un autre script.

Maintenant, dans un fichier de test, j'ai plus de 1000 arguments à passer au script.

Le fichier ressemble à ce qui suit :

Table_1
Table_2
Table_3
Table_4
and..so..on

Maintenant je veux exécuter le script pour qu'il s'exécute en parallèle.

Je fais cela en utilisant une tâche cron.

Tout d'abord, je divise le fichier de test en 20 parties en utilisant la commande split sous Linux.

 split -l $(($(wc -l < test )/20 + 1)) test

Le fichier de test sera ensuite divisé en 20 parties telles que xaa,xab,xac et ainsi de suite.

Ensuite, exécutez le travail cron :

* * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xaa
* * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xab
and so on.

Comme cela implique beaucoup de processus manuels. J'aimerais le faire de manière dynamique.

Voici ce que je veux réaliser :

1) Dès que je reçois le fichier de test, je voudrais qu'il soit automatiquement divisé en 20 fichiers et stocké à un endroit particulier.

2) Ensuite, je voudrais programmer la tâche cron pour chaque jour 5 heures du matin en passant les 20 fichiers comme arguments au script.

Quelle est la meilleure façon de mettre cela en œuvre ? Toute réponse avec explication sera appréciée.

2voto

codeforester Points 17582

Voici ce que vous pouvez faire. Créez deux cron emplois :

  1. file_splitter.sh -> divise le fichier et les stocke dans un répertoire particulier
  2. file_processer.sh -> prend un fichier à la fois dans le répertoire ci-dessus, fait une boucle de lecture, et appelle data.sh . Supprime le fichier après un traitement réussi.

Programme file_splitter.sh de prendre de l'avance sur file_processor.sh .

Si vous souhaitez obtenir un parallélisme plus poussé, vous pouvez faire de la file_splitter.sh écrire les fichiers fractionnés dans plusieurs répertoires avec quelques fichiers dans chacun. Disons qu'ils s'appellent sub1, sub2, etc. Ensuite, vous pouvez programmer plusieurs instances de file_processor.sh et passer le nom du sous-répertoire comme argument. Comme les fichiers fractionnés sont stockés dans des répertoires distincts, nous pouvons nous assurer qu'une seule tâche traite les fichiers d'un sous-répertoire particulier.

C'est mieux de garder le cron la commande la plus simple possible.

* * * * * /path/to/file_processor.sh

est meilleur que

* * * * * while IFS=',' read a;do /home/XXXX/data.sh $a;done < /home/xxxx/xab

C'est logique ?

J'avais écrit un article sur la façon de gérer efficacement les tâches cron. Vous pouvez y jeter un coup d'œil :

Gestion des fichiers journaux créés par les tâches cron

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X