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