Forking / Multi-Threaded Processes | Bash

Greg picture Greg · Sep 21, 2009 · Viewed 121.4k times · Source

I would like to make a section of my code more efficient. I'm thinking of making it fork off into multiple processes and have them execute 50/100 times at once, instead of just once.

For example (pseudo):

for line in file;
do 
foo;
foo2;
foo3;
done

I would like this for loop to run multiple times. I know this can be done with forking. Would it look something like this?

while(x <= 50)
parent(child pid)
{
   fork child()
}
child
{
   do 
   foo; foo2; foo3; 
   done
   return child_pid()
}

Or am I thinking about this the wrong way?

Thanks!

Answer

Aleksandr Levchuk picture Aleksandr Levchuk · Sep 4, 2010

In bash scripts (non-interactive) by default JOB CONTROL is disabled so you can't do the the commands: job, fg, and bg.

Here is what works well for me:

#!/bin/sh

set -m # Enable Job Control

for i in `seq 30`; do # start 30 jobs in parallel
  sleep 3 &
done

# Wait for all parallel jobs to finish
while [ 1 ]; do fg 2> /dev/null; [ $? == 1 ] && break; done

The last line uses "fg" to bring a background job into the foreground. It does this in a loop until fg returns 1 ($? == 1), which it does when there are no longer any more background jobs.