background processing in BASH


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting background processing in BASH
# 8  
Old 04-28-2009
PHP BASH concurrent processing

If you need the child processes to calculate or aquire data and exit, leaving the data for the parent, then files are appropriate. If you need the child processes to continue running and gathering data and STREAM it to the parent, then file are NOT appropriate. For persistent processes: pipes and IPC features are your friends.

The example scripts you provided may have mislead me as to the nature, scope, and conditions of your problem. Can you illuminate the issue better, that I might understand better your constraints and conditions?

Someone once said: "every problem has an elegant, simple, straightforward and easy to understand wrong solution". (Pahaphrased, here, because my memory for quotes resembles a tuna net: it loses all the small stuff!)
# 9  
Old 04-28-2009
Okay, here is the task

Presently I have more than 2 scripts running independently. They run okay and return me a code of 0 for success and more than 0 for failure.
The task is to create another main script and run these independent scripts in parallel.
I am able to achieve this by running them in background and waiting on PID to get the status of each script. The only problem is, that status
of a script ( success or fail) is not known until the "wait" command is processed sequentially by the Linux processer.
I want to know the status of each process at real time.

Is that possible?

I have an example with on of your recommendation using log files which is working. But I am wondering if there is a nifty way to achieve some other way.

Thanks,
SSR
# 10  
Old 04-28-2009
Real-time status of background process

Well, if you want real-time response do not wait upon 'wait'!
Again, there are several solutions.

One easy one is to spawn all of your sub-processes, capturing each PID into a list and the output into an individual results file for that sub-process. Loop through the list, gathering and acting upon the results if they have completed. As part of your processing, if they have completed: then remove them from the list and clean up their results file. When your list is empty, exit the loop and take your closing actions.

Again, you could use an FIFO pipe to accomplish the same thing, but that would be overkill if all they will do is succeed or fail and send back that result.
# 11  
Old 04-28-2009
Is it possible for you to display the loop process with a simple example or use the one that I have provided ?
# 12  
Old 04-28-2009
This is what I got using a log file , I get what I am expecting to acheive.
Although Child1 is fired first , the error is deteced in the order it happend.

Mother Script
-------------
#!/bin/bash
echo -e " Parent continued process 1"
echo -e " Parent continued process 2"
echo -e " ** Kicking off a child process C1** "
./child1 &
echo -e " Parent continued process 3"
echo -e " Parent continued process 4"
echo -e " ** Kicking off a child process C2** "
./child2 &

while true
do
grep "Error:1" ch1.log
if [ $? -eq 0 ]
then
echo " error in child 1 detected "
break
else
continue
fi
done&
t1=$!


while true
do
grep "Error:1" ch2.log
if [ $? -eq 0 ]
then
echo " error in child 2 detected "
break
else
continue
fi
done&
t2=$!

wait $t1
wait $t2
exit 0


child1
-------
#!/bin/bash

echo " " > ch1.log
echo -e " in child process 1 child1 "
sleep 2
echo -e " in child process 2 child1 "
sleep 2
echo -e " in child process 3 child1 "
sleep 7
echo " Error:1" >> ch1.log
exit 1

child2
------
#!/bin/bash
echo " " > ch2.log
echo -e " in child process 4 child2 "
echo -e " in child process 5 child2 "
echo -e " in child process 6 child2 "
echo " Pretend this script crapped first Error:1" >> ch2.log
exit 123

Output :
-------
Parent continued process 1
Parent continued process 2
** Kicking off a child process C1**
Parent continued process 3
Parent continued process 4
** Kicking off a child process C2**
in child process 1 child1
in child process 4 child2
in child process 5 child2
in child process 6 child2
Pretend this script crapped first Error:1
error in child 2 detected in child process 2 child1
in child process 3 child1
Error:1
error in child 1 detected
# 13  
Old 05-04-2009
PHP Background results

This idea works. Note the comments, many are lines I used to determine what was going on when I had a typo. If you think FOREGROUND typos are fun, wiat until you have some in the BACKGROUND!
Note also that pasting here takes away all of my careful indenting that would make the script more human readable. (Sigh)

#!/bin/bash
#
# background processing test

LLIST="case1 case2 case3"
ID=$$

mkdir /tmp/${ID}
LOGDIR=/tmp/${ID}
LLOG=${LOGDIR}/looptest.tmp
RANDOM=16552
# echo "LOG DIRECTORY = ${LOGDIR}"

function mytest {
# function to represent your external script(s)
VAL=$1
WHEN=$2

sleep $WHEN


if [ "$VAL" == "case2" ] ; then
echo "0"
else
echo "1"
fi
echo "DONE"
} ; # end of function or external script

OLIST="$LLIST"
for foo in ${LLIST} ; do
# shall we start them all
LOG=${LOGDIR}/${foo}.tmp
(( j = 5+$RANDOM*10/32767 ))
# RANDOM sleep just to make things wait a bit
echo "start ${foo} with wait $j"
mytest ${foo} ${j} > ${LOG} &
done

# then start a loop to look through the results files
# for completion
TLIST="${OLIST}"
while [ -n "${TLIST}" ] ; do
TLIST=''
# sleep 1 # just to slow things down.
for foo in ${OLIST} ; do
LOG=${LOGDIR}/${foo}.tmp
if [ -e ${LOG} ] ; then
# echo "${LOG} exists"
if grep DONE ${LOG} >/dev/null 2>&1
then
MYRETURN=`grep -v DONE ${LOG}`
echo "${foo}: ${MYRETURN}" |tee -a $LLOG
else
# echo "${LOG} exists but is not DONE yet"
TLIST="${TLIST} ${foo}"
fi
else
# echo "${LOG} does not exist"
TLIST="${TLIST} ${foo}"
fi
done
# echo "TLIST = ${TLIST}"
OLIST="${TLIST}"
done
echo "
============================
RESULTS SUMMARY
"
cat $LLOG

rm -rf ${LOGDIR}
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

[Help] Bash script that runs in the background and checks for mails...

Hello! I have got a homework. The bash script runs in the background and checks the user's mailbox and when the user gets a new mail a popup window appears with some text and information about the sender (from who and when).I have no idea how to start, any help would be appreciated! Thank you:) (1 Reply)
Discussion started by: capo2ndfret
1 Replies

2. Shell Programming and Scripting

Plink (processing multiple commands) using Bash

I'm completely brand new to bash scripting (migrating from Windows batch file scripting). I'm currently trying to write a bash script that will automatically reset "error-disabled" Cisco switch ports. Please forgive the very crude and inefficient script I have so far (shown below). It is... (10 Replies)
Discussion started by: MKANET
10 Replies

3. Shell Programming and Scripting

Parallel processing in bash?

Hi Say I am interested in processing a big data set over shell, and each process individually takes a long time, but many such processes can be pipe-lined, is there a way to do this automatically or efficiently in shell? For example consider pinging a list addresses upto 5 times each. Of... (5 Replies)
Discussion started by: jamie_123
5 Replies

4. Shell Programming and Scripting

Suppress a background message in Bash

I'm having trouble with part of this bash script in Linux where I respawn a new instance of script and kill the old one to prevent forking (Yes, I know 'exec' will not fork but this needs to be interactive) When the old instance is kill it pops up "Terminated!" in the middle of the new instance... (7 Replies)
Discussion started by: Azrael
7 Replies

5. Shell Programming and Scripting

BASH - Handling background processes - distributed processing

NOTE: I am using BASH and Solaris 10 for this. Currently in the process of building a script that has a main "watcher" daemon that reads a configuration file and starts background processes based on it's global configuration. It is basically an infinite loop of configuration reading. Some of the... (4 Replies)
Discussion started by: dcarrion87
4 Replies

6. Shell Programming and Scripting

Background tasks in a loop (bash)

I am trying to use a loop to start tasks 0-3, running 0,1,2 in the background with &. FOLDSET=( 0 1 2 3 ) for FOLDSET in ${FOLDSET} do if ; then BACKGRD="&" else BACKGRD="" fi # start task $FOLDSET task1 -nogui -ni -p $PROJ \ epochs=$EPOS ... (3 Replies)
Discussion started by: LMHmedchem
3 Replies

7. Programming

Unix Shell background processing

So I made my own unix shell, but i want to make a background process when using the & appended to the end, so far most of the commands seem to work (except cd, but thats another story) right now here is what I have got. Im thinking maybe I shouldn't be using switch and maybe switch it to... (27 Replies)
Discussion started by: Mercfh
27 Replies

8. Shell Programming and Scripting

bash tee and background threads

Running centos 2.6, I have a bash script in which I'd like to run a number of background threads in parallel, tee'ing the results of the entire script to one file, while tee'ing the result of each background thread to another. Here's what I'm doing, where the number of csv files control the... (1 Reply)
Discussion started by: heatlamp
1 Replies

9. Linux

background processing in BASH

I have script 3 scripts 1 parent 2 children child1 child2 In the code below the 2 child processes fire almost Instantaneously in the background, Is that possible to know the status of pass/fail of each process "as it happens" ? In the present scenario although Child2... (5 Replies)
Discussion started by: jville
5 Replies

10. Solaris

Best practice to run bash script in background

nohup /bin/bassh $HOME/scripts/test.sh > $HOME/log/test.log 2>&1 & nohup $HOME/scripts/test.sh > $HOME/log/test.log 2>&1 & Which is the good practice to run a script in background of above two ? does the first one will have any overhead on the system ? our system is SunOS 5.10... (2 Replies)
Discussion started by: mmasals
2 Replies
Login or Register to Ask a Question