On 09/20/2010 10:20 PM, PJ Weisberg wrote:
On Mon, Sep 20, 2010 at 7:55 AM, Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:Perhaps I was trying to make my solution too general; i.e., I didn't want to care how many children were started or whether their PIDs had been remembered. But if you always have exactly two children, why not this? coproc read -E trap "print -p" CHLD ./child.sh& pid1=$! ./child.sh& pid2=$! read -p kill $pid1>&/dev/null kill $pid2>&/dev/nullYou *can* rewrite that to not care how many children there are. for thing in $stuff; do ./child.sh $thing set -A pids $pids $! done for child in $pids; do kill $child>&/dev/null done
Ok, I have modified child.sh as following: #!/bin/sh if [ $# -gt 0 ]; then gotsig=0 deadchild=0 trap "exitfunc" INT HUP TERM trap "exitdeadchildfunc" CHLD exitfunc () { echo $$: Got sig... gotsig=1 } exitdeadchildfunc () { echo $$: SIG is CHLD... deadchild=1 } echo $$: Sleeping for $1 seconds sleep $1 & wait if [ $gotsig -ne 0 ]; then if [ $deadchild -ne 0 ]; then echo $$: sleep in for $1 seconds already stopped (no $!) else echo $$: Stopping sleep for $1 seconds in $! kill $! fi else echo $$: Slept for $1 seconds fi else echo No args exit 1; fi So, two normal cases are: % ./parent.sh 6680: Launching 2 child processes 6682: Sleeping for 1 seconds 6683: Sleeping for 5 seconds 6682: SIG is CHLD... 6682: Slept for 1 seconds 6680: Waking coprocess Woken Finishing 6680 6680: got HUP 6680: Waking coprocess 6683: Got sig... 6683: Stopping sleep in 6685 for 5 seconds % ./parent.sh 6686: Launching 2 child processes 6688: Sleeping for 1 seconds 6689: Sleeping for 5 seconds 6688: SIG is CHLD... 6688: Slept for 1 seconds 6686: Waking coprocess Woken Finishing 6686 6686: got HUP 6686: Waking coprocess 6689: Got sig... 6689: SIG is CHLD... 6689: sleep in 6691 for 5 seconds already stopped % And one abnormal case is: % ./parent.sh 6620: Launching 2 child processes 6622: Sleeping for 1 seconds 6623: Sleeping for 5 seconds 6622: SIG is CHLD... 6622: Slept for 1 seconds 6620: Waking coprocess 6620: Waking coprocess % 6623: SIG is CHLD... 6623: Slept for 5 seconds %Now what is happening? Also, anyway do debug it (set -x isn't very helpful since all processes write simultaneously)