2015-06-27 1 views
0

Я знаю, что есть много способов сделать это, но потому, что есть так много, я не знаю, какой из них выбрать.Звоните несколькими другими скриптами Async

То, что я хочу сделать:
1. Начало несколько дочерних сценариев
2. Уметь проверить, работают ли они
3. Уметь убить их
4. Мне не нужно, чтобы захватить их выход и их вывод не нужно отображать.

Каждый из этих сценариев находится в собственном файле.

Я не делал скриптов в то время, и я застрял в мышлении ООП, так что простите меня, если я скажу что-то смешное.

+0

Parallel :: ForkManager – ikegami

+0

Вы не можете использовать оболочку Unix для этой цели, например 'bash'? – reinierpost

+0

Есть другие части сценария, которые намного проще с силой Perl – RogueCSDev

ответ

0

Perl и параллельно не идут хорошо вместе, но вот несколько мыслей:

  • fork() несколько раз, и управлять каждым ребенком независимо
  • Perl позволяет открывать дескрипторы файлов для процессов: open my $fh, '-|', 'command_to_run.sh' , Вы могли бы использовать это и опрашивать тех, кто ручками
  • раскошелиться их на задний план и хранить их идентификаторы процессов
+0

Какова цель '' - | ''? Не могли бы вы привести пример разветвления? – RogueCSDev

2
use Parallel::ForkManager qw(); 

use constant MAX_SIMUL_CHILDREN => 10; 

my $pm = Parallel::ForkManager->new(MAX_SIMUL_CHILDREN); 
for my $cmd (@cmds) { 
    $pm->start() 
     and next; 

    open(STDOUT, '>', '/dev/null') 
     or die($!); 

    exec($cmd) 
     or die($!); 

    $pm->finish(); # Never reached, but that's ok. 
} 

$pm->wait_all_children(); 

Добавление следующих до цикла будет регистрировать PID детей.

$pm->run_on_start(sub { 
    my ($pid, $ident) = @_; 
    print("Child $pid started.\n"); 
}); 

$pm->run_on_finish(sub { 
    my ($pid, $exit_code, $ident, $exit_signal) = @_; 
    if ($exit_signal) { print("Child $pid killed by signal $exit_signal.\n"); } 
    elsif ($exit_code) { print("Child $pid exited with error $exit_code.\n"); } 
    else    { print("Child $pid completed successfully.\n"); } 
}); 

$ident это значение передается $pm->start(). Его можно использовать для указания имени для процесса.

+0

Как я могу проверить, все ли все еще запущены, и убить их? – RogueCSDev

+0

Вы имеете в виду вручную? 'ps' и' kill', как обычно. Если автоматически, то когда? – ikegami

+0

Кстати, перенаправление STDOUT является необязательным. Вы сказали что-то, что намекало, что вы, возможно, не захотите видеть выход детей, поэтому я включил его в качестве демонстрации. – ikegami

Смежные вопросы