7# ----------------------------------------------------------------------------------------
8# Simple desktop batch queue processor.
10# The batch queue is defined by a standard FIFO and
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".
17# The batch queue may also be an existing regular file.
18# The entries in the queue are processed as normal but
19# the batch queue will terminate when the end-of-file is reached.
21# A job can be submitted using the puts_queue function (see qlib.sh or qlib.csh).
22# A series of joint commands can be submitted using a sequence of
23# calls to put_queue, terminated by a single puts_queue call.
24# ----------------------------------------------------------------------------------------
26if [ -z $JPP_DIR ]; then
27 echo "Variable JPP_DIR undefined."
31source $JPP_DIR/setenv.sh $JPP_DIR >& /dev/null
32source $JPP_DIR/software/scripts/qlib.sh
34set_variable: DEBUG MKQUEUE_DEBUG 3
35set_variable: SLEEP_TIME MKQUEUE_SLEEP_TIME 1s # sleep time
36set_variable QUEUE_SIZE 1 # default size of queue
37set_variable COMMAND mkqueue.sh
40 usage "$script <queue name> [queue size] <option>"\
41 "\nPossible options: start, stop, continue, wait, restart."
45 3) set_variable QUEUE_SIZE $argv[2];&
46 2) set_variable QUEUE_NAME $argv[1];
47 set_variable OPTION $argv[-1];;
48 *) fatal "Wrong number of options.";;
52 fatal "This batch queue processor is intended for use on a desktop."
55if (( $QUEUE_SIZE < 1 )); then
56 fatal "Invalid queue size $QUEUE_SIZE."
59if [[ "$OPTION" != "start" ]] && [[ "$OPTION" != "stop" ]] && [[ "$OPTION" != "continue" ]] && [[ "$OPTION" != "wait" ]] && [[ "$OPTION" != "restart" ]]; then
60 fatal "Invalid option $OPTION."
64# short-hand to get PID of batch queue processor
66alias get_mypid="pgrep -f \"$COMMAND *$QUEUE_NAME\""
74# \param 3 sleep time [s]
82 if [[ -e $queue_name ]]; then
84 if [[ -p $queue_name ]]; then
85 fatal "Queue $queue_name in use."
89 mkfifo $queue_name # create a new FIFO
92 fd=7 # file descriptor
94 eval "exec $fd<>$queue_name" # attach file descriptor to FIFO
96 while read job <& $fd; do # read job from file descriptor
98 if [[ -n $job ]]; then
100 if [[ $job = "exit" ]]; then
104 if [[ $job = "wait" ]]; then
106 wait # wait child processes
112 eval exec $job & # submit job
116 while (( ${#jobstates} >= $queue_size )); do
122 rm -f $queue_name # remove FIFO
126if [[ "$OPTION" == "stop" || "$OPTION" == "restart" ]]; then
132 if [[ -n $PID ]]; then
133 notice "Stop $COMMAND $QUEUE_NAME."
137 rm -f $QUEUE_NAME # remove FIFO
139 OPTION=${OPTION/restart/start}
141elif [[ "$OPTION" == "continue" ]]; then
147 if [[ -n $PID ]]; then
148 notice "$script is running with PID(s) $PID"
153elif [[ "$OPTION" == "wait" ]]; then
155 puts_queue $QUEUE_NAME wait
163 if [[ -n $PID ]]; then
171if [[ "$OPTION" = "start" ]]; then
173 notice "Start batch queue ${QUEUE_NAME} >& ${QUEUE_NAME}_log"
175 trap "" HUP # trap hangup
177 queue $QUEUE_NAME $QUEUE_SIZE $SLEEP_TIME >& ${QUEUE_NAME}_log &
179 while [[ ! -e $QUEUE_NAME ]]; do