Question Planificateur de tâches simple basé sur Linux avec des dépendances de travail? [fermé]


Je maintiens un système de stockage de données qui implique beaucoup de travaux dépendants (importation de données, transformation, etc.). J'utilise Linux crontab pour les gérer jusqu'à ce que la dépendance entre les tâches se complique.

Fondamentalement je cherche quelques cron remplacement qui m'aide avec le scénario suivant:

  • Exécuter le travail A à 00:05 (facile). Il s'agit généralement du travail d'importation.

  • Planifiez le travail B, C, D pour qu'il s'exécute après la fin du travail A. Le travail D ne s'exécute que 30 minutes après la fin du travail A (pour répartir la charge). Ce sont les emplois transformés.

  • Le travail E est exécuté lorsque tous les B, C et D sont terminés. Il s’agit généralement du travail qui apporte des données agrégées à une base de données frontale Web.

Tout cela se produit sur le même nœud.

J'imagine que cela ressemble à un graphique de topologie.

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D

Existe-t-il des outils simples basés sur Linux qui prennent en charge cela? J'ai regardé dans Airbnb's Chronos mais il semble exagéré pour mon besoin.

Edit: Le scénario ci-dessus n'est qu'une version simplifiée de ce qui se passe. Nous avons beaucoup plus d'emplois quotidiens et la dépendance est beaucoup plus compliquée. Donc, je suis en train de chercher des cron sur stéroïdes plutôt que des scripts bash cas par cas pour chaque scénario.


4
2018-05-13 10:24


origine


Je suppose que l'utilisation du serveur Jenkins CI serait également excessive. Pourtant, ça marcherait. - Daniel Beck♦
Toi pourrait Faites ceci avec un script bash assez simple qui s'exécute à 00:05 (à travers n'importe quel crond), lance le travail A et attend son achèvement, puis commence B et C en arrière-plan ainsi qu'un sous-processus en arrière qui attend 30 min puis commence D , attend ensuite que tous finissent avant de commencer E, puis quand E termine simplement quitte. Jetez un peu de gestion des erreurs pour faire bonne mesure et vous devriez être prêt à partir. Liens éventuellement utiles: stackoverflow.com/q/356100/486504  stackoverflow.com/a/6041820/486504 Google "bash wait for subprocess" ou similaire. - Michael Kjörling
Michael: Merci. Bien que mon cas d'utilisation soit beaucoup plus compliqué que cela. J'ai mis à jour la question pour réfléchir. - huy
Vous êtes donc à la recherche d'un outil simple pour gérer une version plus complexe et non spécifiée de ce que vous utilisez comme exemple ... Franchement, si c'est le cas, je ne suis pas sûr que la question en l'état soit responsable. alors au moins expliquer pourquoi l’alternative que vous avez trouvée est «excessive» pour vos besoins, et que spécifique fonctionnalités dont vous avez besoin. - Michael Kjörling
vicerveza.homeunix.net/~viric/soft/ts - dans les pensions Debian. - LawrenceC


Réponses:


Comme Michael Kjörling l’a suggéré dans les commentaires, vous devriez pouvoir le faire avec un simple script bash. Quelque chose comme ça:

#!/usr/bin/env bash

## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"

## Change "ls /etc >/dev/null " to reflect the actual 
## jobs you want to run but keep the  "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";

## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &


## Now, monitor the logfile and run job E when the rest have finished
while true; do
    lines=`wc -l $logfile | cut -f 1 -d ' '`;
    echo "$logfile : $lines"
    ## The logfile will contain 4 lines if all jobs have finished
    if [ "$lines" -eq 3 ];
    then
      ## Run job E
      eval $jobE 
      ## Delete the logfile
      rm $logfile
      ## exit the script
      exit 0;
    fi
    ## Only check if the jobs are finished once a minute
    sleep 60;
done

Si tu utilises cron pour lancer ce script à 00:05 il devrait faire ce que vous voulez. L'astuce principale est l'utilisation de sous-marins  () et &&. Les sous-ateliers vous permettent d'exécuter plusieurs tâches en arrière-plan et && pour exécuter uniquement des emplois une fois qu'un autre emploi a réussi.


5
2018-05-13 15:38



Merci pour votre aide @terdon. Désolé je n'étais pas plus clair sur ma situation. Le nombre d'emplois que j'ai est beaucoup plus que cela, et l'interdépendance est beaucoup plus compliquée. Le scénario que j'ai décrit n'est qu'une version simplifiée de ce qui se passera habituellement. - huy


Celles-ci semblent intéressantes:

Ce sont tous les projets python (attendez-vous à digdag) qui visent à remplacer cron par une interface graphique agréable pour voir le graphique des dépendances.

J'avais l'habitude d'utiliser bash pour ce genre de choses, mais ça devient moche quand on grandit dans des systèmes complexes.


3
2017-07-08 17:52





BMC Software fabrique un produit appelé Control-M qui conviendrait parfaitement à votre description du problème. Cependant, ce n'est pas gratuit :(

Nous l'utilisons pour administrer environ 500 emplois en production et près de 400 dans des environnements de test. Vous installez des clients sur les ordinateurs dont vous avez besoin, puis configurez les travaux sur le serveur Control-M pour qu'ils s'exécutent sur les clients. Il existe de nombreux paramètres configurables et critères de planification, qui peuvent tous être administrés via une interface graphique ou une ligne de commande. L’aspect le plus approprié de votre problème réside dans le fait qu’il permet de définir des conditions d’entrée / sortie pour les travaux, de manière à ce que vous puissiez avoir des dépendances par simple glisser-déposer entre les travaux. Nous l'utilisons pour configurer des flux de travail de plus de 20 tâches à la fois.


1
2018-01-24 14:05