Reputation: 971
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.
Upvotes: 1
Views: 1205
Reputation: 52728
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 [email protected] ~/SO/bash ]$ cat A.sh
#!/bin/bash
echo "A Started at: `date`"
sleep 30
echo "A Finished at: `date`"
[ 09:39 [email protected] ~/SO/bash ]$ cat B.sh
#!/bin/bash
echo "B Started at: `date`"
sleep 10
echo "B Finished at: `date`"
[ 09:39 [email protected] ~/SO/bash ]$ cat C.sh
#!/bin/bash
echo "C Started at: `date`"
sleep 5
echo "C Finished at: `date`"
[ 09:38 [email protected] ~/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 [email protected] ~/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 [email protected] ~ ]$ date
Tue Nov 22 19:08:19 PST 2011
[ 19:08 [email protected] ~ ]$ sleep 15 & sleep 20 &
[1] 1126
[2] 1127
[ 19:08 [email protected] ~ ]$ 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 [email protected] ~ ]$
Upvotes: 1
Reputation: 56049
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
Upvotes: 0