Threading ??? Shell Scripts

Steve Siegfried sos at zjod.net
Tue Jun 27 20:13:33 UTC 2006


I'm attaching a script (waaay at the bottom), "DISPATCH", which manages
up to N simultaneous jobs.

Use via something like:

	#!/bin/ksh
	export DISPATCH_MAX = 6      # six jobs at once
	DISPATCH CLEAR               # clear out the bookkeeping directory
	DISPATCH SYNC                # make sure no jobs are still outstanding
	DISPATCH /tmp t01 job1
	DISPATCH /tmp t02 job2
	DISPATCH /tmp t03 job3
	DISPATCH /tmp t04 job4
	DISPATCH /tmp t05 job5
	DISPATCH /tmp t06 job6
	DISPATCH /tmp t07 job7
	DISPATCH /tmp t08 job8
        DISPATCH SYNC
        DISPATCH /tmp t09 job9
        DISPATCH SYNC
        DISPATCH /tmp t10 jobA
        DISPATCH /tmp t11 jobB
        DISPATCH SYNC
	echo "All finished, sir."
        exit

In the above example, job{1,2,3,4,5,6} will be started.  As soon as any one
of those finishes, job7 will be started.  As soon as the next job finishes,
job 8 will start.  The "DISPATCH SYNC" after job8 says that all outstanding
jobs have to finish before "DISPATCH SYNC" will return.  After the SYNC,
job9 will run by itself (single threaded, waited upon by the SYNC after
job9).  When job9 finishes, both jobA and jobB will be started.  As soon
as both jobA and jobB finish, the last DISPATCH SYNC will finish and the
script will exit.

Hope this helps'idly,

-S

Brian D. McGrew wrote:
> 
> Is there any way to sort of make a shell script threaded???
> 
> Something like...
> 
> #!/bin/sh
> 
> Func1()
> {
> 	Param=$1
> }
> 
> Func2()
> {
> 	Param=$1
> }
> 
> Func1 test1 &
> Func2 test2 &
> Func1 test &
> 
> ???
> 
> I think I got the write concept but bad implementation???
> 
> :b!
> 
> Brian D. McGrew { brian at visionpro.com || brian at doubledimension.com }
> --
> > This is a test.  This is only a test!
>   Had this been an actual emergency, you would have been
>   told to cancel this test and seek professional assistance!
> 
> 
> -- 
> fedora-list mailing list
> fedora-list at redhat.com
> To unsubscribe: https://www.redhat.com/mailman/listinfo/fedora-list
> 


############## script starts on next line ####################
#!/bin/ksh
DOIT ()
{
  DIR=$1
  TOUCHME=$DISPATCH_DIR/$2
  shift 2
  CMD=$*
  TF="cd $DIR; $CMD"
  TS=`date +%T`

  rm -f $TOUCHME.PASS $TOUCHME.FAIL
  echo "[$TS] $TF" >  $TOUCHME.ACTIVE
  if [ -d $DIR ]
  then echo "+ cd $DIR"
       cd $DIR
       echo "+ $CMD"
       if $CMD
       then echo "[$TS->`date +%T`] $TF" >  $TOUCHME.PASS
            echo "PASS [$TS->`date +%T`] $TF" >> $HOME/DISPATCH_HISTORY
       else echo "[$TS->`date +%T`] $TF" >  $TOUCHME.FAIL
            echo "FAIL [$TS->`date +%T`] $TF" >> $HOME/DISPATCH_HISTORY
       fi
  else echo "Directory \"$DIR\" not found."
       echo "Unable to execute \"$CMD\"."
       echo "[$TS->`date +%T`] $TF" >  $TOUCHME.FAIL
       echo "FAIL [$TS->`date +%T`] $TF" >> $HOME/DISPATCH_HISTORY
  fi

  rm -f $TOUCHME.ACTIVE
}

# MAIN Main main

#  DISPATCH
#
#  Format: 
#       DISPATCH CLEAR
#       DISPATCH SYNC
#       DISPATCH CDIR TF CMD
#
#       where:
#               CLEAR           - Remove the tracking flag directory ($DISPATCH_DIR)
#               SYNC            - Wait for active processes to finish before exiting
#               CDIR            - Directory to execute CMD in
#               TF              - Tracking flag (actually file $DISPATCH_DIR/$TF)
#               CMD             - The command to execute
#
# Enviornment vars:
#
#       DISPATCH_DIR            - A directory to hold tracking flag files
#                                 Default is $HOME/DISPATCH
#
#       DISPATCH_MAX            - Maximum number of active tasks dispatched
#                                 Default is 4

if [ "X$DISPATCH_MAX" = "X" ]
then integer DISPATCH_MAX=4
fi
export DISPATCH_MAX
if [ "X$DISPATCH_DIR" = "X" ]
then DISPATCH_DIR=$HOME/DISPATCH
fi
export DISPATCH_DIR
if [ ! -d $DISPATCH_DIR ]
then mkdir $DISPATCH_DIR
fi

if [ -f $HOME/STOP ]
then echo "File $HOME/STOP exists... skipping \"DISPATCH $*\""
     exit -1
fi


if [ "X$1" = "XSYNC" ]
then echo "**********************************************************"
     echo "* DISPATCH SYNC -- STARTED                               *"
     echo "**********************************************************"
     while [ `ls -l $DISPATCH_DIR/*.ACTIVE 2>/dev/null | wc -l` -ne 0 ]
     do
         sleep 3
     done
     echo "**********************************************************"
     echo "* DISPATCH SYNC -- FINISHED                              *"
     echo "**********************************************************"
     echo "SYNC [`date +%D` `date +%T`] $TF" >> $HOME/DISPATCH_HISTORY
else if [ "X$1" = "XCLEAR" ]
     then echo "+ DISPATCH CLEAR"
          echo "+ rm -rf $DISPATCH_DIR"
          echo "CLEAR [`date +%D` `date +%T`] $TF" >> $HOME/DISPATCH_HISTORY
          rm -rf $DISPATCH_DIR
     else while [ `ls -l $DISPATCH_DIR/*.ACTIVE 2>/dev/null | wc -l` -ge $DISPATCH_MAX ]
          do
            sleep 3
          done
          if [ -f $HOME/STOP ]
          then echo "File $HOME/STOP exists... skipping \"DISPATCH $*\""
               exit -1
          else DOIT $* &
               sleep 2   # Allow file system to catch up with $DISPATCH_DIR
          fi
     fi
fi




More information about the fedora-list mailing list