Date: Thu, 22 Jan 2009 19:35:01 -0500 From: Maxim Khitrov <mkhitrov@gmail.com> To: Nerius Landys <nlandys@gmail.com> Cc: freebsd-questions@freebsd.org Subject: Re: shell scripting, how to auto-timeout? Message-ID: <26ddd1750901221635k17230c7eudb1edc38c808eb83@mail.gmail.com> In-Reply-To: <560f92640901221458y9409360n34904461fb2580e4@mail.gmail.com> References: <560f92640901221241y4fc1620aree083a812c1f3c8d@mail.gmail.com> <26ddd1750901221333x5356f4f3l6b6410fc05d4e6d4@mail.gmail.com> <560f92640901221451j2e2b259bw1559a8c8d8912941@mail.gmail.com> <560f92640901221458y9409360n34904461fb2580e4@mail.gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 22, 2009 at 5:58 PM, Nerius Landys <nlandys@gmail.com> wrote:
> Actually, because of the "exec" in the parent script, the line below
> it, the "killing terminator process" line, never gets reached. So the
> terminator process that waits to kill its parent always waits the full
> 5 seconds in the background. If I pipe the output of the parent
> script through less, it waits 5 seconds before it reaches the end of
> the output. That is annoying. Is there any way to solve that?
>
I see what you mean. Here's another option without exec:
#!/bin/sh -T
kill_all()
{
echo 'killing everything'
kill $SPID $CPID 2> /dev/null
exit 0
}
trap kill_all SIGCHLD
./child &
CPID=$!
sleep 5 &
SPID=$!
echo "child is $CPID"
echo "sleeper is $SPID"
wait
Here I'm using the fact that the termination of any child process
causes SIGCHILD to be sent to the parent. Notice the '-T' in the first
line; this is important, because without it the 'wait' call isn't
interrupted until both children are dead. Unfortunately, this is a
non-standard option, so you'll have to check if it is supported in
your environment.
- Max
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?26ddd1750901221635k17230c7eudb1edc38c808eb83>
