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
 
  235while [[ -e /proc/${dep} ]]; do
 
  243N=\$(ps | grep "${wait_script:t:r}" | wc -l)
 
  250                    chmod u+x ${wait_script}
 
  255                sed -i "1a\\\n${wait_script}\n" ${exec_file}
 
  258            puts_queue ${queue_name} ${exec_file}