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"} } } }
In reply to Re: Running 'top' command (of linux) for few minutes and then come out of system command (of perl)
by zentara
in thread Running 'top' command (of linux) for few minutes and then come out of system command (of perl)
by Striker
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |