comment exécuter automatiquement un script bash lorsque mes travaux qsub sont terminés sur un serveur?

StackOverflow https://stackoverflow.com/questions/3886168

Question

Je voudrais lancer un script lorsque tous les emplois que je l'ai envoyé à un serveur sont fait.

par exemple, j'envoyer

ssh server "for i in config*; do qsub ./run 1 $i; done"

Et je retourner une liste des emplois qui ont été lancées. Je voudrais commencer automatiquement un autre script sur le serveur pour traiter la sortie de ces emplois une fois que tous sont terminés.

J'apprécierait des conseils qui me aider à éviter la solution inélégante suivante:

Si je sauvegarde chacun des années identifiant d'emploi 1000 par l'appel ci-dessus dans un fichier séparé, je pouvais vérifier le contenu de chaque fichier sur la liste actuelle des emplois en cours d'exécution, à savoir la sortie d'un appel à:

ssh qstat

Je seulement besoin de vérifier toutes les demi-heure, mais j'imagine qu'il ya une meilleure façon.

Était-ce utile?

La solution

Cela dépend un peu de ce que planificateur de tâches que vous utilisez et quelle version, mais il y a une autre approche qui peut être pris aussi si vos résultats de traitement peut également être fait sur la même file d'attente que le travail.

Une façon très pratique de gérer beaucoup de travail connexe dans les versions les plus récentes de couple (et avec le moteur de la grille, et d'autres) est de lancer les tout travaux individuels comme un tableau d'emploi (voir http://docs.adaptivecomputing.com/torque/4-1- 4 / contenu / sujets / commandes / qsub.htm # -t ). Cela nécessite la cartographie des pistes individuelles vers des numéros en quelque sorte, ce qui peut ou peut ne pas être commode; mais si vous pouvez le faire pour vos travaux, elle simplifie grandement la gestion des emplois; vous pouvez les qsub en une seule ligne, vous pouvez qdel ou QHOLD tous à la fois (tout en ayant la capacité de traiter des emplois pris individuellement).

Si vous faites cela, vous pouvez soumettre un travail d'analyse qui a une dépendance sur le tableau des emplois qui ne fonctionnent une fois que tous les emplois dans le tableau étaient complètes: (voir http://docs.adaptivecomputing.com/torque/4-1-4 /Content/topics/commands/qsub.htm#dependencyExamples ). La soumission du travail ressemblerait à ceci:

qsub analyze.sh -W depend=afterokarray:427[]

où analyze.sh avait le script pour faire l'analyse, et 427 seraient l'identifiant de l'emploi de l'ensemble des emplois que vous avez lancé. (Les [] moyens que courir après tout sont terminées). Les diffère de syntaxe pour les autres ordonnanceurs (par exemple, SGE / OGE), mais les idées sont les mêmes.

Obtenir ce droit peut prendre un certain faire, et certainement l'approche de Tristan a l'avantage d'être simple, et de travailler avec un planificateur; mais d'apprendre à utiliser des tableaux d'emploi dans cette situation si vous allez faire beaucoup de cela peut être utile de votre temps.

Autres conseils

Quelque chose que vous pourriez envisager est d'avoir chaque script de travail il suffit de toucher un nom de fichier dans un dossier dédié comme $i.jobdone, et dans votre script maître, vous pouvez simplement utiliser ls *.jobdone | wc -l pour tester le bon nombre d'emplois fait.

Vous pouvez utiliser attente pour arrêter l'exécution jusqu'à ce que tous les travaux sont faits. Vous pouvez même Ramassez tous les états de sortie et d'autres statistiques en cours d'exécution (temps qu'il a fallu, compter des travaux faits à l'époque, peu importe) si vous le cycle autour d'attente pour ids spécifiques.

J'écrirait un petit programme C pour faire l'attente et la collecte (si vous disposez des autorisations de télécharger et de fichiers exécutables), mais vous pouvez facilement utiliser le bash attente intégrée pour à peu près la même but, mais avec moins de flexibilité.

Modifier : petit exemple

.
#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

Si vous exécutez ce script en arrière-plan, il ne vous dérange pas et tout ce qui vient après la ligne attente fonctionnera lorsque vos travaux sont terminés.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top