4 # \author mdejong, bjjung
 
    6 #--------------------------------------------------------------------------------------
 
    8 #                   Utility script for batch queue functions.
 
   10 #--------------------------------------------------------------------------------------
 
   14 # Put command(s) in given queue; do not submit job.
 
   17 # \param   2-N       command(s)
 
   24     echo -n "$*;" >> $queue_name
 
   29 # Put command(s) in given queue and submit job.
 
   32 # \param   2-N       command(s)
 
   39     echo "$*" >> $queue_name
 
   48 # \param   3         sleep time [s]
 
   56     if [[ -e $queue_name ]]; then
 
   58         if [[ -p $queue_name ]]; then
 
   59             fatal "Queue $queue_name in use."
 
   63         mkfifo $queue_name                                # create a new FIFO
 
   66     fd=7                                                  # file descriptor
 
   68     eval "exec $fd<>$queue_name"                          # attach file descriptor to FIFO
 
   70     while read job <& $fd; do                             # read job from file descriptor
 
   72         if [[ -n $job ]]; then
 
   74             if [[ $job = "exit" ]]; then
 
   79             eval exec $job &                              # submit job
 
   83             while (( ${#jobstates} >= $queue_size )); do
 
   89     rm -f $queue_name                                     # remove FIFO
 
   93 # Function to configure jobs.\n
 
   94 # Sets the environment variable EXEC_FILE, LOG_FILE as well as START_JOB and SUBMIT_JOB\n
 
   95 # depending upon whether a new job should be set up or submitted.
 
   97 # \param  groupsize       task group size
 
   98 # \param  exec_filename   execution file name
 
  103         2) local groupsize=$2;
 
  104            local exec_filename=$1;;
 
  105         *) fatal "configure_job(): Invalid number of arguments."
 
  108     if [[ ! ${exec_filename} =~ '%' ]]; then
 
  109         fatal "configure_job(): Missing wildcard character in ${exec_filename}."
 
  112     if [[ -z $TASKID ]]; then  # Initialize task ID
 
  116     if [[ -z $GROUPID ]]; then # Initialize task group ID
 
  120     local integer SUBTASKID=$(( TASKID % groupsize ))
 
  122     if (( groupsize == 1 )); then
 
  124         export EXEC_FILE=${exec_filename/\%/${GROUPID}}
 
  125         export LOG_FILE=${EXEC_FILE:r}.log      
 
  132     elif (( SUBTASKID == 1 )); then # configure job start
 
  134         export EXEC_FILE=${exec_filename/\%/${GROUPID}}
 
  135         export LOG_FILE=${EXEC_FILE:r}.log      
 
  142     elif (( SUBTASKID > 1 )); then
 
  147     elif (( SUBTASKID == 0 )); then # configure job submission
 
  162 # Function to reset job configuration variables.
 
  175 # Function to submit a job.
 
  177 # \param  exec_file     job script
 
  178 # \param  queue_name    batch queue name
 
  179 # \param  scratchdir    scratch directory
 
  180 # \param  dependencies  dependency PIDs
 
  184     local scratchdir=${TMPDIR:-/tmp}
 
  187         4) dependencies=($4);&
 
  189         2) local queue_name=$2;&
 
  190         1) local exec_file=$1;;
 
  191         *) local exec_file=${argv[1]}
 
  192            local queue_name=${argv[2]}
 
  193            scratchdir=${argv[3]}
 
  194            dependencies=(${argv[4,-1]})
 
  197     chmod +x ${exec_file}
 
  199     if (( ${+queue_name} )); then           
 
  201         if ( is_CCNikhef ); then
 
  203             local depstr="depend=afterok$(printf ':%s' ${dependencies[@]})"
 
  206                 -N ${exec_file:t:r}.${USER} -V  \
 
  207                 ${dependencies:+-W ${depstr}}   \
 
  215             if (( ${+dependencies} )); then
 
  219                 local depstr=$(printf '_%s' ${dependencies[@]})
 
  221                 set_variable wait_script   ${scratchdir}/await${depstr}.sh              
 
  223                 if [[ ! -f ${wait_script} ]]; then
 
  225                     exec 9> ${wait_script}
 
  231                     for dep in ${dependencies[@]}; do
 
  235 while [[ -e /proc/${dep} ]]; do
 
  243 N=\$(ps | grep "${wait_script:t:r}" | wc -l)
 
  245 if (( N == 1 )); then
 
  250                     chmod u+x ${wait_script}
 
  255                 sed -i "1a\\\n${wait_script}\n" ${exec_file}
 
  258             puts_queue ${queue_name} ${exec_file}