Я запускаю несколько сценариев bash из сценария Perl и хочу отслеживать их и регистрировать их поведение.
Я знаю, что могу сказать, работает ли процесс с kill 0, $pid
, и могу ли я получить код выхода из $?
, но, запустив несколько сценариев в фоновом режиме, я не могу связать значения $?
с процессы, которые дали его в качестве кода выхода.
Как я могу запустить эти сценарии параллельно, но получить код завершения для каждого из них? Мне нужно что-то вроде proc_get_status
из PHP.
Извините, что не указали код с самого начала.
Я сократил код, поэтому важно увидеть.
use warnings;
use strict;
use IPC::Open3;
use IO::Handle;
my $timeLimit = 60*60; # some time limit not to be crossed
my $startTime = time();
my @commands = (); # fill up with commands to be executed
my @processes = ();
foreach my $cmd (@commands) {
my $stdout = IO::Handle->new;
my $stderr = IO::Handle->new;
my $pid = open3(undef, $stdout, $stderr, $cmd);
push @processes, {"pid" => $pid, "out" => $stdout, "err" => $stderr, "cmd" => $fullcmd};
}
do {
if (time() - $startTime > $timeLimit) {
kill 2, $_->{pid} foreach (@processes);
@processes = ();
last;
} else {
for (my $i = 0; $i < @processes; $i++) {
unless (kill 0, $processes[$i]) {
# if it's not running, I would like to check the exit code and log it from here on.
# also remove it from the array, thats why I used for and not foreach, so I can use splice later.
}
}
}
} while (@processes > 0);