How to have a script wait for jobs before proceeding
Jump to navigation
Jump to search
If you want to have some dependency between different jobs, you can use the "-hold_jid" flag in qsub command or cmd file. For example, if you want c.sh runs when a.sh and b.sh both finish or quit, the commands can be as the following:
qsub -N job1 ./a.sh qsub -N job2 ./b.sh qsub -hold_jid job1,job2 -N job3 ./c.sh
[The -N names your job for simplicity]
Old Example
Create a script named jobhold.sh that contains the following:
#!/bin/bash # jobhold.sh # JB 8/2010 # usage: # jobhold.sh qsub <my_command> # jobhold.sh q.sh <my_command> # For commands that are submitted to cluster, hold until jobs have completed shopt -s expand_aliases sleep_time=30 # seconds; don't make this too short! don't want to tax system with excessive qstat calls me=`whoami` alias myqstat='qstat | grep $me' stdout=`$@` # call the command and capture the stdout id=`echo $stdout | awk -F' ' '{print $3}'` # get the jobid status=`myqstat | grep $id` # check to see if job is running while [ -n "$status" ] # while $status is not empty do sleep $sleep_time status=`myqstat | grep $id` done
Then, in the script, just put the jobhold.sh command in front of the step for which the script should be held until it has finished running on the cluster:
> job_hold.sh <your_command>
eg
> job_hold.sh q.sh bet -in structural.nii.gz -out structural_brain.nii.gz