From: Paul Winward Date: 2008-05-11T04:28:26+09:00 Subject: Re: capture output in real time I found a perl solution at http://www.perlmonks.org/?node_id=305812 that makes use of pseudo tty to get line-buffered output. Unfortunately, I can find very little documentation on how to use the ruby module PTY, and it looks like it is no longer supported (http://www.ruby-forum.com/topic/134771#new). Also, I wonder if a pseudo tty can capture stderr as well (http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2003-07/0544.html) The perl solution is system dependent, but it worked for me on Linux 2.6.22. I did see a debian package libpty-ruby but I don't see any documentation and am not sure if this is still supported. The notion of a pseudo tty is new to me and I'd appreciate any help. Is there a ruby equivalent for the perl solution below? Thanks #!/usr/bin/perl -w use strict; use IO::Pty; my $pty = new IO::Pty; my $slave = $pty->slave(); my $pid = fork(); die "Couldn't fork: $!" unless defined $pid; if($pid){ # dup STDOUT to Pty and run external program: $pty->close_slave(); open(STDOUT, ">&",$pty)||die $!; system "perl blackbox.pl"; print "\cD"; # send ^d to end } else { # this is your monitoring process $pty->make_slave_controlling_terminal(); print "*$_" while <$slave>; exit; } __END__ Paul Winward wrote: > Another approach I had tried was to use IO.select, as shown in > http://whynotwiki.com/Ruby_/_Process_management ( attributed to Jamis > Buck). This too, produced the same delay in output, but is shown below: > > Thank you for any help > > def read_until(pipe, stop_at, verbose = true) > lines = [] > line = "" > while result = IO.select([pipe]) #, nil, nil, 10) > next if result.empty? > > c = pipe.read(1) > break if c.nil? > > line << c > break if line =~ stop_at > > # Start a new line? > if line[-1] == ?\n > puts line if verbose > lines << line > line = "" > end > end > lines > end > > > > Paul Winward wrote: >> Thanks for the suggestion but I'm still having the problem. >> >> Paul >> >> ara.t.howard wrote: >>> On May 9, 2008, at 6:08 PM, Paul Winward wrote: >>>> >>>> Note, I'm avoiding STDOUT.flush in sleep.rb since I won't be able to >>>> change the actual scripts I'll be passing to popen3. >>> >>> popen3 is going to be using fork/exec under the hood and should >>> inherit the sync setting of STDOUT, so try setting >>> >>> STDOUT.sync = true >>> >>> before the popen and see if that helps - untested, but i'm running out >>> the door.... >>> >>> cheers. >>> >>> a @ http://codeforpeople.com/ -- Posted via http://www.ruby-forum.com/.