assigning values to variables in the background

Nikos Vassiliadis nvass at gmx.com
Tue Jan 15 23:51:24 UTC 2013


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,

Nikos



More information about the freebsd-questions mailing list