Как я могу заставить Perl ожидать дочерних процессов, запущенных в фоновом режиме с системы ()?

Я столкнулся с этой ошибкой, и проблема заключалась в том, что у меня в проекте был класс с тем же именем сборки, на которую я пытался ссылаться. Я изменил название класса, и это сработало.

10
задан Chris 3 May 2014 в 00:19
поделиться

3 ответа

Использование fork / exec / wait не так уж и плохо:

my @a = (1, 2, 3);
for my $p (@a) {
   my $pid = fork();
   if ($pid == -1) {
       die;
   } elsif ($pid == 0) {
      exec '/bin/sleep', $p or die;
   }
}
while (wait() != -1) {}
print "Done\n";
16
ответ дан 3 December 2019 в 14:00
поделиться

Преобразование в fork () может быть трудным, но это правильный инструмент. system () - это блокирующий вызов; вы получаете неблокирующее поведение, выполняя оболочку и приказывая ей запускать ваши скрипты в фоновом режиме. Это означает, что Perl не знает, какими могут быть PID дочерних элементов, а это значит, что ваш скрипт не знает, чего ждать.

Вы можете попытаться передать PID скрипту Perl, но это быстро выходит из рука. Используйте fork ().

9
ответ дан 3 December 2019 в 14:00
поделиться

Вам нужно будет что-то изменить, изменение кода для использования fork, вероятно, проще, но если вы категорически против использования fork, вы можете использовать сценарий оболочки оболочки, который коснется файла, когда это будет сделано, а затем ваш код Perl проверит наличие файлов.

Вот оболочка:

#!/bin/bash

$*

touch /tmp/$2.$PPID

Ваш код Perl будет выглядеть так:

for my $p (@a){
    system("/path/to/wrapper.sh /path/to/file.sh $p &");
}
while (@a) {
    delete $a[0] if -f "/tmp/$a[0].$$";
}

Но я думаю, что код разветвления безопаснее и яснее:

my @pids;
for my $p (@a) {
    die "could not fork" unless defined(my $pid = fork);\
    unless ($pid) { #child execs
        exec "/path/to/file.sh", $p;
        die "exec of file.sh failed";
    }
    push @pids, $pid; #parent stores children's pids
}

#wait for all children to finish
for my $pid (@pids) {
    waitpid $pid, 0;
}
13
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: