comment exécuter automatiquement un script bash lorsque mes travaux qsub sont terminés sur un serveur?
j'aimerais lancer un script lorsque tous les travaux que j'ai envoyés à un serveur sont terminés.
par exemple, j'envoie
ssh server "for i in config*; do qsub ./run 1 $i; done"
et je récupère une liste des jobs qui ont été commencés. J'aimerais lancer automatiquement un autre script sur le serveur pour traiter la sortie de ces tâches une fois que tout est terminé.
j'apprécierais tout conseil qui pourrait m'aider à éviter la solution inélégante suivante:
si je sauvegarde dans un fichier séparé chacun des 1000 numéros d'identification de travail à partir de l'appel ci-dessus, je peux vérifier le contenu de chaque fichier par rapport à la liste actuelle des tâches en cours d'exécution, c'est-à-dire la sortie d'un appel vers:
ssh qstat
Je n'aurais besoin de vérifier que toutes les demi-heures, mais j'imagine qu'il y a un meilleur moyen.
3 réponses
cela dépend un peu du Planificateur de tâches que vous utilisez et de la version, mais il y a une autre approche qui peut être adoptée si votre traitement des résultats peut aussi être fait sur la même File que le travail.
une façon très pratique de gérer beaucoup de tâches connexes dans les versions plus récentes de torque (et avec grid engine, et d'autres) est de lancer les tâches individuelles comme un tableau de tâches (cf. http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#-t ). Il faut pour cela que la personne exécute des numéros d'une façon ou d'une autre, ce qui peut être ou ne pas être pratique; mais si vous pouvez le faire pour votre travail, cela simplifie grandement la gestion des travaux; vous pouvez qsub them all in one line, vous pouvez qdel ou qhold them all at once (tout en ayant la capacité de traiter les travaux individuellement).
si vous faites cela, alors vous pourriez soumettre une analyse emploi dépendant de l'ensemble des emplois qui ne fonctionneraient qu'une fois que tous les emplois de l'ensemble seraient terminés: (cf. http://docs.adaptivecomputing.com/torque/4-1-4/Content/topics/commands/qsub.htm#dependencyExamples ). Soumettre le travail ressemblerait à:
qsub analyze.sh -W depend=afterokarray:427[]
où analyze.sh si vous aviez le script pour faire l'analyse, et 427 serait l'id de tâche du tableau de jobs que vous avez lancé. (Les [] signifie seulement courir après tout). La syntaxe diffère 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 n'importe quel planificateur; mais apprendre à utiliser des tableaux de travail dans cette situation si vous ferez beaucoup de cela peut valoir votre temps.
quelque chose que vous pourriez considérer est d'avoir chaque script de travail juste de toucher un nom de fichier dans un dossier dédié comme $i.jobdone
, et dans votre script maître, vous pourriez simplement utiliser ls *.jobdone | wc -l
pour tester le bon nombre de travaux effectués.
vous pouvez utiliser wait pour arrêter l'exécution jusqu'à ce que tous vos travaux soient terminés. Vous pouvez même collecter tous les états de sortie et autres statistiques d'exécution (temps qu'il a fallu, compte des travaux effectués à ce moment-là, peu importe) si vous faites le tour en attendant des identifiants spécifiques.
j'écrirais un petit programme C pour faire l'attente et la collecte( si vous avez les permissions pour télécharger et exécuter des exécutables), mais vous pouvez facilement utiliser le bash wait intégré à peu près dans le même but, mais avec moins de souplesse.
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érangera pas et tout ce qui vient après la ligne wait s'exécutera lorsque vos travaux seront terminés.