in reply to Running 'top' command (of linux) for few minutes and then come out of system command (of perl)
And for multiple command reading, throw them into a select loop.#!/usr/bin/perl use warnings; use strict; use IPC::Open3; my $pid = $$; my $pid1 = open3(0, \*READ,0,"top -d 2 -b -p $pid "); #if \*ERROR is false, STDERR is sent to STDOUT while(1){ my @words = split(/\s+/,<READ>); $words[0] ||= 0; if($words[0] =~ /$pid/){print "$words[4] $words[9]\n"} #print "$words[0]\n"; } waitpid($pid, 1); # It is important to waitpid on your child process, # otherwise zombies could be created.
#!/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 # add more commands here if you want, but make sure the # filehandles are different. It would be an improvement to use # IO::Handle for the filehandles my $sel = new IO::Select(); $sel->add(\*READ); $sel->add(\*ERROR); my($error,$answer)=('',''); 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"} } } }
|
|---|