sh script difficulties (running parallel functions)
Dan Nelson
dnelson at allantgroup.com
Thu Nov 1 10:23:14 PDT 2007
In the last episode (Nov 01), David Naylor said:
> Hi,
>
> I am having a hard time getting (very complex script for me) to work. The
> basic idea is that this script runs a bunch of tarkets, many of which are
> time consuming but low on resources (such as downloading files). Now if I
> run the tarkets all at once (given some dependancy issues) it greatly speeds
> up the process (about 5 time speed increase). However I do not know how to
> do this using sh...
>
> Example
>
> #!/bin/sh
>
> worker1() {
> # Copy some files
> }
>
> worker2() {
> # Download some files
> }
>
> worker3() {
> # Do something else
> }
>
> ..... # and so on
>
> run_jobs() {
> worker1 &
> worker2 &
> worker3 &
> # !!! Somehow wait for over workers to finish before continuing !!!
> }
You can use the "wait" shell builtin to wait for all children.
> #Finished
>
> Furthermore, how can signals be handled such that the signals get
> accumulated and once all the other workers have finished the signals get
> passed on (appropriately)
You mean trapping ^C in the parent so that you can't stop the script
until all the workers are done? That's more complicated to do in a
shell script. Masking ^C completely is easy using the "trap" builtin ,
but catching it and then doing a "kill -INT $$" after all your workers
have completed is more complicated since the "wait" command will exit
when a signal is received, and I don't think it will tell you why it
exited (all children done, or got a signal).
--
Dan Nelson
dnelson at allantgroup.com
More information about the freebsd-questions
mailing list