I run it on Windows 2000.
Then you could use the Win32::Job module, standard with ActivePerl 5.8.
For example:
use strict;
use Win32::Job;
my @cmds = (
[ "netstat", 'netstat -na' ],
[ $^X, 'perl -le "print\"pid=$$:Sleep 5 secs.\";sleep 5"' ],
);
my $job = Win32::Job->new();
my @pids; my $i = 0;
for my $cmd (@cmds) {
++$i;
my $pid = $job->spawn($cmd->[0], $cmd->[1],
{ stdin => 'NUL', stdout => "$i.out", stderr => "$i.err" } )
or die "spawn: $^E";
push(@pids, $pid);
}
print "Processes pids: @pids are running...\n";
$job->run(60); # allow up to 60 seconds for all processes to end
print "Job complete (output in files 1.out/1.err/2.out/2.err).\n";
my $stat = $job->status();
for my $pid (@pids) {
exists($stat->{$pid}) or die "oops, no status for $pid";
my $rc = $stat->{$pid}->{exitcode};
my $t = $stat->{$pid}->{time};
print "pid=$pid, rc=$rc, elapsed time=$t->{elapsed} secs\n";
}
Update: Sorry, on re-reading your question, I don't think Win32::Jobs will help you. I suggest you simply launch the processes using Win32::Process (also standard with ActivePerl) and exit.
use strict;
use Win32::Process;
my $SysDir = "$ENV{SystemRoot}\\system32";
my @cmds = (
[ "$SysDir\\netstat.exe", 'netstat -na' ],
[ $^X, 'perl -le "print\"pid=$$:Sleep 5 secs.\";sleep 5"' ],
);
for my $cmd (@cmds) {
Win32::Process::Create(my $hProc, # process object
$cmd->[0], # executable
$cmd->[1], # command line
1, # inherit handles
NORMAL_PRIORITY_CLASS, # priority
'.') # working dir
or die "error create process: $^E\n";
my $pid = $hProc->GetProcessID();
print "Process pid $pid launched.\n";
}
print "I'm outta here.\n";
|