7# ----------------------------------------------------------------------------------------
8# Simple desktop batch queue processor.
10# The batch queue is defined by a standard FIFO.
11# The entries in the queue are processed line-by-line.
12# Each entry is executed as a separate process in the background,
13# commonly referred to as a job.
14# The number of jobs that can simultaneously run is limited by the queue size.
15# The batch queue can be terminated by submitting a job with contents "exit".
16# The user can wait for the batch queue to complete processing of all submitted jobs
17# by submitting a job with contents "wait".
19# The batch queue may also be an existing regular file.
20# The entries in the queue are processed as normal.
21# The batch queue will terminate when the end-of-file is reached.
23# A job can be submitted using the puts_queue function (see qlib.sh or qlib.csh).
24# A series of joint commands can be submitted using a sequence of
25# calls to put_queue, terminated by a single puts_queue call.
26# ----------------------------------------------------------------------------------------
28if [ -z $JPP_DIR ]; then
29 echo "Variable JPP_DIR undefined."
33source $JPP_DIR/setenv.sh $JPP_DIR >& /dev/null
36set_variable: DEBUG MKQUEUE_DEBUG 3
37set_variable: SLEEP_TIME MKQUEUE_SLEEP_TIME 1s # sleep time
38set_variable QUEUE_SIZE 1 # default size of queue
39set_variable COMMAND mkqueue.sh
42 usage "$script <queue name> [queue size] <option>"\
43 "\nPossible options: start, stop, continue, wait, restart."
47 3) set_variable QUEUE_SIZE $argv[2];&
48 2) set_variable QUEUE_NAME $argv[1];
49 set_variable OPTION $argv[-1];;
50 *) fatal "Wrong number of options.";;
54 fatal "This batch queue processor is intended for use on a desktop."
57if (( $QUEUE_SIZE < 1 )); then
58 fatal "Invalid queue size $QUEUE_SIZE."
61if [[ "$OPTION" != "start" ]] && [[ "$OPTION" != "stop" ]] && [[ "$OPTION" != "continue" ]] && [[ "$OPTION" != "wait" ]] && [[ "$OPTION" != "restart" ]]; then
62 fatal "Invalid option $OPTION."
66# short-hand to get PID of batch queue processor
68alias get_mypid="pgrep -f \"$COMMAND *$QUEUE_NAME\""
76# \param 3 sleep time [s]
84 if [[ -e $queue_name ]]; then
86 if [[ -p $queue_name ]]; then
87 fatal "Queue $queue_name in use."
91 mkfifo $queue_name # create a new FIFO
94 fd=7 # file descriptor
96 eval "exec $fd<>$queue_name" # attach file descriptor to FIFO
98 while read job <& $fd; do # read job from file descriptor
100 if [[ -n $job ]]; then
102 if [[ ${(Q)job} = "exit" ]]; then
106 if [[ ${(Q)job} = "wait" ]]; then
108 wait # wait child processes
114 eval exec $job & # submit job
118 while (( ${#jobstates} >= $queue_size )); do
124 rm -f $queue_name # remove FIFO
128if [[ "$OPTION" == "stop" || "$OPTION" == "restart" ]]; then
134 if [[ -n $PID ]]; then
135 notice "Stop $COMMAND $QUEUE_NAME."
139 rm -f $QUEUE_NAME # remove FIFO
141 OPTION=${OPTION/restart/start}
143elif [[ "$OPTION" == "continue" ]]; then
149 if [[ -n $PID ]]; then
150 notice "$script is running with PID(s) $PID"
155elif [[ "$OPTION" == "wait" ]]; then
157 puts_queue $QUEUE_NAME wait
165 if [[ -n $PID ]]; then
173if [[ "$OPTION" = "start" ]]; then
175 notice "Start batch queue ${QUEUE_NAME} >& ${QUEUE_NAME}_log"
177 trap "" HUP # trap hangup
179 queue $QUEUE_NAME $QUEUE_SIZE $SLEEP_TIME >& ${QUEUE_NAME}_log &
181 while [[ ! -e $QUEUE_NAME ]]; do