Attendre pour l'ensemble de qsub travaux

j'ai un script de lot qui démarre quelques travaux qsub, et je veux les piéger quand ils sont tous terminés.

Je ne veux pas utiliser l'option-sync, parce que je veux qu'ils tournent simultanément. Chaque tâche a un ensemble différent de paramètres de ligne de commande.

je veux que mon script attende que tous les travaux soient terminés, et faire quelque chose après cela. Je ne veux pas utiliser la fonction de veille par exemple, pour vérifier si certains fichiers ont été généré après chaque 30 s, parce que c'est une ponction sur les ressources.

je crois que Torque a quelques options, mais je fais tourner SGE.

des idées sur la façon dont je pourrais mettre en œuvre ce s'il vous plaît?

Merci P. s. J'ai trouvé un autre thread Lien

qui a eu une réponse

vous pouvez utiliser l'attente pour arrêter l'exécution jusqu'à ce que tous vos travaux sont faits. Vous pouvez même collectez tous les états de sortie et autres statistiques de fonctionnement (temps qu'il a fallu, compte des travaux effectués à l'époque, peu importe) si vous roulez autour en attendant des identifiants spécifiques.

mais je ne suis pas sûr de savoir comment l'utiliser sans sonder sur une certaine valeur. Peut-on utiliser le piège de bash, mais comment le ferais-je avec qsub?

26
demandé sur Community 2012-07-17 18:52:10

7 réponses

lancez vos travaux qsub, en utilisant l'option-N pour leur donner des noms arbitraires (job1, job2, etc):

qsub -N job1 -cwd ./job1_script
qsub -N job2 -cwd ./job2_script
qsub -N job3 -cwd ./job3_script

lancez votre script et dites-lui d'attendre que les travaux nommés job1, job2 et job3 soient terminés avant de commencer:

qsub -hold_jid job1,job2,job3 -cwd ./results_script
28
répondu SDGator 2013-05-31 15:47:23
qsub -hold_jid job1,job2,job3 -cwd ./myscript
3
répondu j_m 2012-09-22 17:24:19

une autre variante (de ici ) est la suivante:

FIRST=$(qsub job1.pbs)
echo $FIRST
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs)
echo $SECOND
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs)
echo $THIRD

l'intuition est que qsub renvoie le jobid et que celui-ci est typiquement sous-évalué à la sortie standard. Au lieu de cela, capturez-le dans une variable ( $FIRST , $SECOND , $THIRD ) et utilisez le drapeau -W depend=afterany:[JOBIDs] lorsque vous interrogez vos emplois pour contrôler la structure de dépendance de quand ils sont déclarés.

2
répondu ncemami 2015-12-10 18:22:12

si tous les emplois ont un motif commun dans le nom, vous pouvez fournir ce motif lorsque vous soumettez les emplois. https://linux.die.net/man/1/sge_types vous montre quels modèles vous pouvez utiliser. exemple:

-hold_jid "job_name_pattern*"
2
répondu sk8asd123 2017-12-13 19:40:59

dans le cas où vous avez 150 fichiers que vous voulez traiter et être en mesure d'exécuter seulement 15 à chaque fois, tandis que l'autre sont dans la tenue dans la file d'attente, vous pouvez définir quelque chose comme ceci.

# split my list files in a junk of small list having 10 file each
awk 'NR%10==1 {x="F"++i;}{ print >  "list_part"x".txt" }'  list.txt

qsub tous les emplois d'une manière telle que le premier de chaque list_part*.txt tenir le second ....la deuxième, de la troisième .....et ainsi de suite.

for list in $( ls list_part*.txt ) ; do
    PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting
 for file in  $(cat $list )  ; do
   NEXT_JOB=$(qsub -v file=$file  -W depend=afterany:$PREV_JOB  myscript.sh )
   PREV_JOB=$NEXT_JOB
 done
done

c'est utile si vous avez dans myscript.sh une procédure qui nécessite le déplacement ou le téléchargement de nombreux fichiers ou créer un trafic intense dans le cluster-lan

1
répondu el_selvaje 2016-03-17 13:55:43

cela fonctionne à bash, mais les idées doivent être portables. Utilisez -terse pour faciliter la construction d'une chaîne de caractères avec des identificateurs de tâches à attendre, puis soumettez un travail fictif qui utilise -hold_jid pour attendre les travaux précédents et -sync y pour que qsub ne revienne pas avant qu'il (et donc tous les prereqs) ait terminé:

# example where each of three jobs just sleeps for some time:
job_ids=$(qsub -terse -b y sleep 10)
job_ids=job_ids,$(qsub -terse -b y sleep 20)
job_ids=job_ids,$(qsub -terse -b y sleep 30)
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE"  
  • -terse l'option rend la sortie de qsub juste être le job id
  • -hold_jid option (comme mentionné dans d'autres réponses) fait un travail d'attendre sur les id de tâche
  • -sync y option (référencée par L'OP) demande à qsub de ne pas revenir tant que le travail soumis n'est pas terminé
  • -b y spécifie que la commande n'est pas un chemin vers un fichier de script (par exemple, j'utilise sleep 30 comme commande)

Voir la l'homme page pour plus de détails.

1
répondu user3780389 2017-09-27 19:46:29

j'avais besoin de plus de flexibilité, donc j'ai construit un module Python pour ceci et d'autres buts ici . Vous pouvez exécuter le module directement sous forme de script ( python qsub.py ) pour une démo.

Utilisation:

$ git clone https://github.com/stevekm/util.git
$ cd util
$ python
Python 2.7.3 (default, Mar 29 2013, 16:50:34)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import qsub
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True)
qsub command is:

qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F
set -x
echo foo; sleep 60
set +x
E0F

>>> qsub.monitor_jobs(jobs = [job], print_verbose = True)
Monitoring jobs for completion. Number of jobs in queue: 1
Number of jobs in queue: 0
No jobs remaining in the job queue
([Job(id = 4112505, name = python, log_dir = None)], [])

conçu avec Python 2.7 et SGE puisque c'est ce que notre système exécute. Les seules bibliothèques Python non standard requises sont les modules tools.py et log.py inclus, et sh.py (aussi inclus)

évidemment pas aussi utile si vous souhaitez rester purement dans bash , mais si vous avez besoin d'attendre sur qsub jobs alors j'imagine que votre flux de travail est en bordure vers une complexité qui gagnerait à utiliser Python à la place.

0
répondu user5359531 2017-11-16 20:54:08