Perl: ожидание завершения фонового процесса - PullRequest
2 голосов
/ 05 августа 2010

Моя проблема в том, что при запуске следующего будет сказано, что скрипт bash успешно завершился. Но он не ждет завершения сценария, если он завершится раньше, он переместит нужный файл. Так что же я делаю не так, что он не будет ждать завершения фонового процесса для перемещения файлов?

my $pid = fork();
    if($pid == -1){
     die;
    } elsif ($pid == 0){
     #system(@autoDeploy) or die;
     logit("Running auto deploy for $bundleApp");
     exec("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro &") 
                    or logit("Couldnt run the script.");
    }
    while (wait () != -1){

    }
    logit("Ran autoDeploy");

    logit("Moving $bundleApp, to $bundleDir/old/$bundleApp.$date.bundle");
    move("$bundleDir/$bundleApp", "$bundleDir/old/$bundleApp.$date.bundle");
    delete $curBundles{$bundleApp};

Ответы [ 2 ]

5 голосов
/ 05 августа 2010

Самое простое, что вы делаете неправильно - это использовать & в конце командной строки exec - это означает, что вы дважды разветвляетесь, и процесс, который вы wait выполняете, немедленно завершится.

На самом деле я не вижу, для чего здесь вам нужна fork / exec, хотя, если вы не перенаправляете ввод-вывод и ничего не делаете, но ждете execобработать до конца;это то, для чего system.

system("./deployer -d $domain.$enviro -e $enviro >> /tmp/$domain.$enviro") 
                and logit("Problem running deployer: $?");

легко послужит заменой первых двенадцати строк вашего кода.

И, как проходная заметка, fork не делаетвернуть -1 при неудаче;он возвращает undef, так что вся проверка полностью ложная.

1 голос
/ 05 августа 2010

Вам не нужно использовать & в параметрах exec, так как вы уже работаете под форком.

...