in reply to top and STDERR hell...

Try IPC::Open3:
#!/usr/bin/perl use warnings; use strict; use IPC::Open3; use IO::Select; my $pid = $$; my $pid1 = open3(0, \*READ,\*ERROR,"top -d 1 -b -p $pid "); #if \*ERROR is false, STDERR is sent to STDOUT my $sel = new IO::Select(); $sel->add(\*READ); $sel->add(\*ERROR); while(1){ foreach my $h ($sel->can_read){ my $buf = ''; if ($h eq \*ERROR){ sysread(ERROR,$buf,4096); if($buf){print "ERROR-> $buf\n"} }else{ sysread(READ,$buf,4096); if($buf){print "$buf\n"} } } }

I'm not really a human, but I play one on earth. flash japh

Replies are listed 'Best First'.
Re^2: top and STDERR hell...
by DouglasDD (Beadle) on Jun 08, 2005 at 14:36 UTC
    Nope, still 80 cols (even after adding $ENV{'COLUMNS'} = 1000;).

    Neat tho', Both IPC::Open3, and IO::Select are new to me.

    ./ddd

      If you are looking to fool the process into different columns, maybe you need to use IO::Pty. I havn't been able to figure it out myself, but there is something in "clone_winsize_from(\*FH)".

      I have this example in my collection, and I can't remember where I got it...probably google.groups or here. Anyway, it may have a few hints for you.

      #!/usr/bin/perl -w # Description: Fool a process into # thinking that STDOUT is a terminal, when in fact # it may be a file or a pipe. This can be useful # with programs like ps and w on linux... which # will trunc their output to the width of the # terminal, and, if they cannot detect the terminal # width, use a default 80 columns. Wouldn't it be # nice to say "ps -aux | grep etcshadow", and get # output that looks like when you just say "ps # -aux"? Well, that's the idea. #try ./pseudotty "xterm -e top" #or ./pseudotty top use warnings; use strict; use IO::Pty; die "usage: ptyexec command [args]\n" unless @ARGV; my $pty = IO::Pty->new; my $slave = $pty->slave; open TTY,"/dev/tty" or die "not connected to a terminal\n"; $pty->clone_winsize_from(\*TTY); close TTY; my $pid = fork(); die "bad fork: $!\n" unless defined $pid; if (!$pid) { # $slave->close(); open STDOUT,">&=".$pty->fileno() or die $!; exec @ARGV; }else{ $pty->close(); while (defined (my $line = <$slave>)) { print $line; } } #cleanup pty for next run $pty->close();

      I'm not really a human, but I play one on earth. flash japh
        <keanu-reeves-voice>Whoah!</keanu-reeves-voice>

        I'll play around with that code, but I don't think that I'll try to deliver a solution that's based on it. I know for a fact that code is an order of magnitude beyond the unix hackery knowledge of anyone else at this company. And being honest, I'll admit that a tad beyond mine as well.
        A good brain stretching excercise, but I don't want want my bread and butter to depend on it!

        ./ddd