Как я могу выполнить внешнюю команду Windows и мгновенно вернуться в Perl? - PullRequest
6 голосов
/ 14 октября 2010

Я пытался использовать system () с fork (), пробовал exec () и все еще не получил то, что мне нужно.

Я хочу написать сценарий Perl, который выполняет, скажем, другойPerl-скрипт 5 раз подряд (отправляя ему разные значения параметров), но он запускается одновременно.Я понимаю, что могу превратить свой скрипт в файл .pm и ссылаться на него, но я бы предпочел сохранить дочерний скрипт независимым от родителя ...

  • system () работает, но выполняет командыпоследовательно (имеет смысл для документа)
  • exec () не работает - он выполняет только первый метод (имеет смысл для документа)
  • Я добавил fork () в дочерний скрипт Perl, а затемпопытался использовать system ()
  • , это тоже не сработало.
  • команда backtick 'Documents говорит, что она работает так же, как system () ...

Isn'Есть ли в Perl простой способ (я использую WindowsXP) выполнить процесс, не заботясь о возвращаемых значениях или антишихе и просто перейдя к следующей строке родительского скрипта?

Ответы [ 5 ]

12 голосов
/ 14 октября 2010

вы можете сделать это следующим образом (форк в родительском, exec в дочернем):

for my $cmd qw(command1 command2 command3) {
       exec $cmd unless fork
}

способ, которым работает exec $cmd unless fork, заключается в том, что fork вернет истинное значение в родительском(идентификатор процесса) и вернет ложное значение в дочернем элементе, поэтому exec $cmd запускается только в том случае, если fork возвращает ложное значение (иначе в дочернем элементе).

или если вы хотите следить запроцесс выполняется одновременно:

my @procs;

for my $cmd qw(cmd1 cmd2 cmd3) {

   open my $handle, '-|', $cmd or die $!;

   push @procs, $handle;
}

, тогда вы можете прочитать элемент @procs, если вам нужно.

Или взгляните на один из многих модулей cpan, например:Forks::Super, которые обрабатывают детали управления вилкой.

8 голосов
/ 14 октября 2010

В Windows вы можете присвоить суперсекретный 1 флаг системе IIRC.

system 1, @cmd;

Быстрый поиск в Google по этому вопросу в perlmonks дает: http://www.perlmonks.org/?node_id=639814

Надеждаэто помогает.

3 голосов
/ 14 октября 2010

Очень легкий подход.

Windows:

foreach my $cmd (@cmds)
{
    `start $cmd`;
}

Unix:

foreach my $cmd (@cmds)
{
     `$cmd &`;
}
2 голосов
/ 14 октября 2010

Модуль для этой работы избыточен.Вы хотите fork создать новый процесс и затем exec, чтобы выполнить команду в новом процессе.Чтобы запустить пять команд, вам нужно что-то вроде:

 for (my $i=0; $i<5; $i++) {
     if (fork() == 0) {
         exec($command[$i]);   # runs command, doesn't return
     }
 }
2 голосов
/ 14 октября 2010

Вам нужно раскошелиться на родителя, затем выполнить в новом процессе. Это выглядит так, если предположить, что A - оригинальный скрипт, а B - тот, который вы хотите выполнить 5 раз:

                A1
fork in A1   -> A1 A2
exec B in A2 -> A1 B2
fork in A1   -> A1 A3 B2
exec B in A3 -> A1 B3 B2

и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...