Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Why cant i save output of tasklist.exe in an array?

by swissknife (Sexton)
on Apr 10, 2014 at 10:23 UTC ( [id://1081783]=perlquestion: print w/replies, xml ) Need Help??

swissknife has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks,

To make a decision further in my program, i need to check if a process is running or not and for that i am trying following.

use strict; use warnings; use Data::Dumper; my $BACKUPSTATE = "tasklist.exe"; my $state = "ovbbccb"; open (DDDD, "$BACKUPSTATE |") || die "Failed: $!\n"; my @cmdout; while ( <DDDD> ) { @cmdout = $_; } close (DDDD); print "Output of command is =" . Dumper(@cmdout);

i am expecting the complete output of command tasklist.exe but the output is just last line

output: Output of command is =$VAR1 = 'tasklist.exe 2 +716 RDP-Tcp#1 3 5\'936 K ';

How can i get complete output in array so later i can use it to grep $state

Replies are listed 'Best First'.
Re: Why cant i save output of tasklist.exe in an array?
by Corion (Patriarch) on Apr 10, 2014 at 10:30 UTC

    In your loop, you are overwriting all previously stored values:

    @cmdout = $_;

    Maybe you wanted to push? Or maybe you wanted to directly read the output of the command into the array?

    my @cmdout = qx($BACKUPSTATE);

    See perlop for qx() (in "Quote-Like Operators").

Re: Why cant i save output of tasklist.exe in an array?
by Bloodnok (Vicar) on Apr 10, 2014 at 10:29 UTC
    The problem is in @cmdout = $_; - where you continually initialize the array with the current line, methinx you actually meant to code push @cmdout, $_;
    A user level that continues to overstate my experience :-))
Re: Why cant i save output of tasklist.exe in an array?
by Preceptor (Deacon) on Apr 10, 2014 at 16:27 UTC

    As other monks mention - your problem is you overwrite the array

    @cmdout = <DDDD>;

    Will probably do what you want.

    On a more general style point - I would suggest strongly that you use 3 argument open, instead of two arg, because interpolated variables are a good way to introduce bugs.

    open ( my $dddd_fh, "|-", $BACKUPSTATE ); my @cmdout = <$dddd_fh>; chomp(@cmdout); print Dumper(@cmdout);
Re: Why cant i save output of tasklist.exe in an array?
by kcott (Archbishop) on Apr 11, 2014 at 00:44 UTC

    G'day swissknife,

    I see you got a couple of quick replies to your immediate problem.

    For future reference, check this from open:

    "If the open involved a pipe, the return value happens to be the pid of the subprocess."

    And this from kill:

    "If SIGNAL is either the number 0 or ... This is useful to check that a child process is still alive ..."

    [Read the full details, caveats, portability issues and so on for both of those.]

    As a general technique for checking on this sort of process, you can do something along these lines:

    my $pid = open my $pipe, '-|', ... ... if (kill 0 => $pid) { # actions if process alive } else { # actions if process not alive }

    -- Ken

Re: Why cant i save output of tasklist.exe in an array?
by Laurent_R (Canon) on Apr 10, 2014 at 17:51 UTC
    You could probably make it even simpler with back ticks:
    my @cmdout = `tasklist.exe`;

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1081783]
Approved by Bloodnok
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others meditating upon the Monastery: (5)
As of 2024-04-19 15:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found