Question

I have three shell scripts say A, B and C. I need to run A in the background and run B in the background till A finishes its execution in the background. Similarly run C in the foreground till A and B finish their execution.

I was doing this for 2 processes earlier in this way.

./A.sh &  
while ps -p $! >/dev/null; do   
./B.sh  
done 

I need to run B in background and C in foreground till A finishes its execution in background. How do I modify the above code.

Was it helpful?

Solution

This will run A & B in the background with C in the foreground; B&C will loop until A finishes:

#!/bin/bash

./A.sh &
APID=$!

while ps -p ${APID} >/dev/null; do
    ./B.sh & ./C.sh
done

Example from my box:

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat A.sh
#!/bin/bash
echo "A Started at: `date`"
sleep 30
echo "A Finished at: `date`"

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat B.sh
#!/bin/bash
echo "B Started at: `date`"
sleep 10
echo "B Finished at: `date`"

[ 09:39 jon@hozbox.com ~/SO/bash ]$ cat C.sh
#!/bin/bash
echo "C Started at: `date`"
sleep 5
echo "C Finished at: `date`"

[ 09:38 jon@hozbox.com ~/SO/bash ]$ ./how-to-program-in-this-bash-script-of-background-processes.sh
A Started at: Wed Nov 23 09:38:39 PST 2011
C Started at: Wed Nov 23 09:38:39 PST 2011
B Started at: Wed Nov 23 09:38:39 PST 2011
C Finished at: Wed Nov 23 09:38:44 PST 2011
C Started at: Wed Nov 23 09:38:44 PST 2011
B Started at: Wed Nov 23 09:38:44 PST 2011
B Finished at: Wed Nov 23 09:38:49 PST 2011
C Finished at: Wed Nov 23 09:38:49 PST 2011
C Started at: Wed Nov 23 09:38:49 PST 2011
B Started at: Wed Nov 23 09:38:49 PST 2011
B Finished at: Wed Nov 23 09:38:54 PST 2011
C Finished at: Wed Nov 23 09:38:54 PST 2011
C Started at: Wed Nov 23 09:38:54 PST 2011
B Started at: Wed Nov 23 09:38:54 PST 2011
B Finished at: Wed Nov 23 09:38:59 PST 2011
C Finished at: Wed Nov 23 09:38:59 PST 2011
C Started at: Wed Nov 23 09:38:59 PST 2011
B Started at: Wed Nov 23 09:38:59 PST 2011
B Finished at: Wed Nov 23 09:39:04 PST 2011
C Finished at: Wed Nov 23 09:39:04 PST 2011
C Started at: Wed Nov 23 09:39:04 PST 2011
B Started at: Wed Nov 23 09:39:04 PST 2011

A Finished at: Wed Nov 23 09:39:09 PST 2011
B Finished at: Wed Nov 23 09:39:09 PST 2011
C Finished at: Wed Nov 23 09:39:09 PST 2011
[ 09:39 jon@hozbox.com ~/SO/bash ]$


What about forking A and B at the same time, but put A second so $! gives A's pid:

./B.sh & ./A.sh &
while ps -p $! >/dev/null; do   
./C.sh  
done 

Heres an example from my box:

[ 19:08 jon@hozbox.com ~ ]$ date
Tue Nov 22 19:08:19 PST 2011
[ 19:08 jon@hozbox.com ~ ]$ sleep 15 & sleep 20 &
[1] 1126
[2] 1127
[ 19:08 jon@hozbox.com ~ ]$ while ps -p $! > /dev/null; do sleep 1 && date; done
Tue Nov 22 19:08:26 PST 2011
Tue Nov 22 19:08:27 PST 2011
Tue Nov 22 19:08:28 PST 2011
Tue Nov 22 19:08:29 PST 2011
Tue Nov 22 19:08:31 PST 2011
Tue Nov 22 19:08:32 PST 2011
Tue Nov 22 19:08:33 PST 2011
Tue Nov 22 19:08:34 PST 2011
Tue Nov 22 19:08:35 PST 2011
Tue Nov 22 19:08:36 PST 2011
Tue Nov 22 19:08:37 PST 2011
Tue Nov 22 19:08:38 PST 2011
[1]-  Done                    sleep 15
Tue Nov 22 19:08:39 PST 2011
Tue Nov 22 19:08:40 PST 2011
Tue Nov 22 19:08:41 PST 2011
Tue Nov 22 19:08:42 PST 2011
Tue Nov 22 19:08:43 PST 2011
[2]+  Done                    sleep 20
Tue Nov 22 19:08:44 PST 2011
[ 19:08 jon@hozbox.com ~ ]$

OTHER TIPS

From your picture, it looks like you want B and C to loop while A is running, and then kill both after A completes. Here is the code for that:

# Run A in the background and get its process ID
./A.sh &
PIDA = $!

# Loop B in the background and get its process ID
while ps $PIDA >/dev/null 2>&1; do
    ./B.sh
done &
PIDB = $!

# Loop C like B, get its PID
while ps $PIDA >/dev/null 2>&1; do
    ./C.sh
done &
$PIDC = $!

# Wait until A finishes, then kill B and C
wait $PIDA
ps $PIDB >/dev/null 2>&1 && kill $PIDB
ps $PIDC >/dev/null 2>&1 && kill $PIDC
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top