Recently I ran into the problem of killing child processes. I want the output of a command in a variable, so something like this:
output="$(command...)"The problem is two fold: the command itself spawns new children, and the command I'm running may not terminate. What I want to do is set a timer, then when the time is up I would kill the process. To kill it though, I would have to kill the youngest (inner most) child. I couldn't find a simple way to do this, so this is what I came up with:
output="$(command...)" &
t=1
d=0
while (( "$t" < 120 && "$d" == 0 )); do
sleep 1
if jobs | grep -v 'Done' | grep -v 'Exit 1' | grep 'parse' > /dev/null; then
t="$(( $t + 1 ))"
else
d=1
fi
done
if (( "$d" == 0 )); then
ps -AH | grep -A 10 "^ *$(jobs -l | awk '{print $2}')" | grep -B 10 ps | grep -v ps | awk '{print $1}' | while read pid; do
kill -9 "$pid"
done
output=''
else
output="$(command..)"
fi
My question is, is there a simpler way?
No comments
Post a Comment