background processing in BASH | Unix Linux Forums | Linux

  Go Back    


Linux RedHat, Ubuntu, SUSE, Fedora, Debian, Mandriva, Slackware, Gentoo linux, PCLinuxOS. All Linux questions here!

background processing in BASH

Linux


Closed Thread    
 
Thread Tools Search this Thread Display Modes
    #1  
Old 04-27-2009
jville jville is offline
Registered User
 
Join Date: Nov 2008
Last Activity: 2 October 2014, 8:52 AM EDT
Posts: 97
Thanks: 11
Thanked 8 Times in 8 Posts
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 failed first ( exit 1 ) the status is not displayed until Child1 is complete.

I would really apprecitate your help.

Mother Process:

Code:
 #!/bin/bash
 
 echo -e " Parent continued process 1"
 echo -e " Parent continued process 2"
 echo -e " ** Kicking off a child process C1** "
 ./child1 &
 t1=$!
 echo -e " Parent continued process 3"
 echo -e " Parent continued process 4"
 echo -e " ** Kicking off a child process C2** "
 ./child2 &
 t2=$!
 
  wait $t1
  if [ $? -ne 0 ]
  then
    echo " Child Process C1 failed !!! "
  fi
 
  wait $t2
  if [ $? -ne 0 ]
  then
    echo " Child Process C2 failed !!! "
  fi
 
 exit 0

Child1

Code:
 
 #!/bin/bash
 echo -e " in child process 1 "
 sleep 2
 echo -e " in child process 2 "
 sleep 2
 echo -e " in child process 3 "
 sleep 7
 exit 0 # success

Child 2

Code:
  #!/bin/bash
 echo -e " in child process 4"
 echo -e " in child process 5"
 echo -e " in child process 6"
 exit 1 # failed

Thanks,
SSR.

Last edited by otheus; 04-28-2009 at 09:37 AM.. Reason: Please use code tags instead of font tags
Sponsored Links
    #2  
Old 04-28-2009
otheus's Avatar
otheus otheus is offline Forum Advisor  
Smartass
 
Join Date: Feb 2007
Last Activity: 3 December 2014, 3:10 AM EST
Location: Innsbruck, Austria
Posts: 2,153
Thanks: 12
Thanked 49 Times in 46 Posts
Quote:
In the present scenario although Child2 failed first ( exit 1 ) the status is not displayed until Child1 is complete.
That's because you are waiting for the first child before anything else. You can try plain "wait", but that doesn't return until ALL children have completed.

What you can do is set up a wait-loop, and then set up a signal handler to call "jobs" or check on the specific status of any jobs; and set up an alarm-like thingy to wake up the signal handler. The wait call then gets pre-empted. So for instance, something like this (untested) in bash might work:


Code:
job1 & 
job2 &

# turn off immeidate job notification
set +b

# trap USR1 signal with null action
trap test USR1

# set up an alarm
{ sleep 1; kill -USR1 $$; } &
# disown so it does not show up in job table
# (with other shells, this can be emulated by starting it as its own session leader)
disown $!   # acts differently in ksh

# keep waiting till all jobs are complete
while ! wait; do 
   DONE=`jobs -n | sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'`
   if [ -n "$DONE" ]; then 
      echo -n "Jobs $DONE were completed at " 
      date
   fi
   # restart timer
   { sleep 1; kill -USR1 $$ ; } &
   disown $!
done

When wait exits with 0, there are no remaining background tasks, and the loop terminates. If you don't have bash, but have "setsid", you can effectively disown a process that way.
Sponsored Links
    #3  
Old 04-28-2009
jville jville is offline
Registered User
 
Join Date: Nov 2008
Last Activity: 2 October 2014, 8:52 AM EDT
Posts: 97
Thanks: 11
Thanked 8 Times in 8 Posts
Getting an error

./p2: line 25: kill: (24255) - No such process
    #4  
Old 04-29-2009
otheus's Avatar
otheus otheus is offline Forum Advisor  
Smartass
 
Join Date: Feb 2007
Last Activity: 3 December 2014, 3:10 AM EST
Location: Innsbruck, Austria
Posts: 2,153
Thanks: 12
Thanked 49 Times in 46 Posts
Are you using bash?

Have you tried "set -x" at the top of the code to see where execution fails? (Line 25 doesn't really help).
Sponsored Links
    #5  
Old 04-29-2009
jville jville is offline
Registered User
 
Join Date: Nov 2008
Last Activity: 2 October 2014, 8:52 AM EDT
Posts: 97
Thanks: 11
Thanked 8 Times in 8 Posts
here is the o/p after I added set -x

+ ./child1
+ ./child2
+ set +b
+ trap test USR1
+ sleep 1
+ disown 24540
+ wait
in child process 1 child1
in child process 4 child2
in child process 5 child2
in child process 6 child2
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 25575
+ wait
in child process 2 child1
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 26616
+ wait
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 27658
+ wait
in child process 3 child1
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 28694
+ wait
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 29744
+ wait
+ kill -USR1 24534
++ test
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
++ jobs -n
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 30772
+ wait
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ disown 31808
+ wait
+ sleep 1
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 371
+ wait
+ kill -USR1 24534
++ test
++ jobs -n
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 1486
+ wait
+ kill -USR1 24534
++ test
++ sed -n '/ Done / s/^\[\([0-9]*\)\].*/\1/p'
++ jobs -n
+ DONE=
+ '[' -n '' ']'
+ sleep 1
+ disown 2516
+ wait

$ + kill -USR1 24534
./p2: line 26: kill: (24534) - No such process
Sponsored Links
    #6  
Old 04-29-2009
otheus's Avatar
otheus otheus is offline Forum Advisor  
Smartass
 
Join Date: Feb 2007
Last Activity: 3 December 2014, 3:10 AM EST
Location: Innsbruck, Austria
Posts: 2,153
Thanks: 12
Thanked 49 Times in 46 Posts
Ah, so this means all subprocesses completed, allowing the wait to exit. The disowned process then had nothing to kill because the script had already finished.

You can just add a

sleep 2

to the end so you don't get this message. Or, you can redirect the kill's stderr to /dev/null.
Sponsored Links
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
processing tab-formated output of command w/bash sweede Shell Programming and Scripting 2 05-23-2008 10:17 PM
Processing extended ascii character file names in UNIX (BASH scipts) peli UNIX for Advanced & Expert Users 9 04-06-2008 06:17 PM
Bash: Can I run in background with pipes jjinno Shell Programming and Scripting 3 01-03-2008 08:51 PM
Best practice to run bash script in background mmasals Solaris 2 12-11-2007 11:30 AM



All times are GMT -4. The time now is 02:29 AM.