Forum: Ruby Re: ruby tail

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
555c1193071e97926fa67c038244c047?d=identicon&s=25 Phy Prabab (Guest)
on 2007-02-22 10:43
(Received via mailing list)
Actually, I am not sure how this would work.  If I do this, I get no
output from the file:

`tail -f sim.out`

So there is something basic I am missing here.  Any help?

TIA,
Phy

----- Original Message ----
From: Kevin Jackson <foamdino@gmail.com>
To: ruby-talk ML <ruby-talk@ruby-lang.org>
Sent: Thursday, February 22, 2007 1:33:19 AM
Subject: Re: ruby tail

> Is there a gem or perhaps a method I am not aware of that does the similar function of 
tail?  Or is there a way to use tail in ruby?   I have a file that I want to process as 
new data is appended to the file.  This is easy enough using tail and tail has the added 
advantage that it can follow a file if it is "rolled".

Just call out to tail

def tail(f)
  `tail f`
end

or similar - if tail does what you want, use it

Kev
9ea8a6477bb65605c85dc1db2da18864?d=identicon&s=25 Kevin Jackson (Guest)
on 2007-02-22 10:50
(Received via mailing list)
> Actually, I am not sure how this would work.  If I do this, I get no output from the 
file:
>
> `tail -f sim.out`
>
> So there is something basic I am missing here.  Any help?

it shells out to the process and waits for it to return - with -f does
tail ever return? if not you may not be able to use it - AFAIK ` and
exec are the same - someone with better ruby knowledge may be able to
offer a solution - perhaps using threads or something

Kev
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (regularfry)
on 2007-02-22 11:00
(Received via mailing list)
Kevin Jackson wrote:
> offer a solution - perhaps using threads or something
Use IO.popen:

IO.popen('tail -f sim.out'){|f|
  while line = f.gets
    p line
  end
}
Ffcb418e17cac2873d611c2b8d8d891c?d=identicon&s=25 unknown (Guest)
on 2007-02-22 11:06
(Received via mailing list)
>> exec are the same - someone with better ruby knowledge may be able to
>> offer a solution - perhaps using threads or something
> Use IO.popen:
>
> IO.popen('tail -f sim.out'){|f|
>   while line = f.gets
>     p line
>   end
> }

Out of interest, the blocking call is "gets" here, right? Can you use
Kernel.select on a bunch of those handles?

Cheers,
  Benj
Ad7805c9fcc1f13efc6ed11251a6c4d2?d=identicon&s=25 Alex Young (regularfry)
on 2007-02-22 11:14
(Received via mailing list)
benjohn@fysh.org wrote:
>>> offer a solution - perhaps using threads or something
>
I haven't ever done that, but it looks like it from the docs...
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2007-02-22 11:22
(Received via mailing list)
On 22.02.2007 10:59, Alex Young wrote:
>> exec are the same - someone with better ruby knowledge may be able to
>> offer a solution - perhaps using threads or something
> Use IO.popen:
>
> IO.popen('tail -f sim.out'){|f|
>     while line = f.gets
>         p line
>     end
> }

You can do it in pure Ruby:

11:14:14 [Temp]: rm x; for ((i=0;i<30;++i)); do echo $i; sleep 0.2; done
 > x & ruby tail.rb
removed `x'
[1] 2252
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[1]+  Done                    for ((i=0; i<30; ++i))
do
     echo $i; sleep 0.2;
done > x
tail.rb:12:in `sleep': Interrupt
         from tail.rb:12:in `tail'
         from tail.rb:5:in `loop'
         from tail.rb:5:in `tail'
         from tail.rb:16
11:14:31 [Temp]: cat tail.rb
# we never return!
def tail(file)
   io = File.open(file)

   loop do
     while ( line = io.gets )
       puts line
     end

     # uncomment next to watch what is happening
     # puts "-"
     sleep 1
   end
end

tail "x"
11:14:35 [Temp]:

Kind regards

  robert
E0d864d9677f3c1482a20152b7cac0e2?d=identicon&s=25 Robert Klemme (Guest)
on 2007-02-22 14:15
(Received via mailing list)
This version is safer and a tad more flexible, just in case there is an
exception (e.g. because of thread interruption):

def tail(file, interval=1)
   raise "Illegal interval #{interval}" if interval < 0

   File.open(file) do |io|
     loop do
       while ( line = io.gets )
         puts line
       end

       # uncomment next to watch what is happening
       # puts "-"
       sleep interval
     end
   end
end

Cheers

  robert
This topic is locked and can not be replied to.