Date: Wed, 16 Jan 2013 01:46:01 +0200 From: Nikos Vassiliadis <nvass@gmx.com> To: glarkin@FreeBSD.org Cc: Free BSD Questions list <freebsd-questions@freebsd.org>, Robert Bonomi <bonomi@mail.r-bonomi.com> Subject: Re: assigning values to variables in the background Message-ID: <50F5EA39.5020106@gmx.com> In-Reply-To: <50F5AE41.1040305@FreeBSD.org> References: <50F594E9.7000606@gmx.com> <50F5AE41.1040305@FreeBSD.org>
index | next in thread | previous in thread | raw e-mail
On 1/15/2013 9:30 PM, Greg Larkin wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 1/15/13 12:42 PM, Nikos Vassiliadis wrote: >> Hi, >> >> A bit of an OT question. I am writing a bourne shell script that >> collects data from a router. Since netstat & vmstat can run for a >> numbers of iterations I thought I would use just that: >> >> stats() ( nstats=`netstat -I ng0 -q 1 60 | tail -1` & >> rawdata=`vmstat -c 2 60 | tail -1` wait ... >> >> The logic was: 1. run the first process in the bg 2. run the second >> process 3. wait to make sure the first process has finished 4. >> continue further >> >> It makes perfect sense why this doesn't work. Both commands run in >> the foreground. >> >> I am going to split the time between netstat and vmstat. So, it >> will be 30 seconds of netstat and 30 seconds of vmstat. >> >> But I am still interested/curious how one should go for this using >> the shell. So, can this be done without files? Any thoughts? >> >> Thanks, Nikos > > > Hi Nikos, > > As far as I can tell, the backticks are what's causing the problem. > Even though you put the first command in the background (maybe with > the & inside the backticks, though), the assignment to the nstats > variables causes the script to block. > > If you switch to using temp files, you may have more luck, e.g.: > > netstat -w 1 -I ng0 -q 60 | tail -1 > /tmp/netstat.$$ & > npid=`echo $!` > vmstat -w 2 -c 60 | tail -1 > /tmp/vmstat.$$ & > vpid=`echo $!` > wait $npid > nstats=`cat /tmp/netstat.$$` > rm -f /tmp/netstat.$$ > wait $vpid > rawdata=`cat /tmp/vmstat.$$` > rm -f /tmp/vmstat.$$` Yes, this looks probably like something I will use too. Just for the fun of it and using a separator(Robert's idea), I came up with this: > delay=10 > > a=$( > ( > echo netstat `netstat -I ng0 -q 1 $delay | tail -1` netstat > ) & > > ( > echo vmstat `vmstat -c 2 $delay | tail -1` vmstat > ) > ) > > echo $a If someone else has something else to add I'll be glad to hear it, no matter how crazy! Thanks for your answers Greg & Robert, Nikoshelp
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?50F5EA39.5020106>
