1

我目前遇到了一个在我想要它之前运行的 shell 命令的问题。例如,我有 6 个命令我都想连续运行,前 5 个运行良好,但是一旦我到达最后一个,它依赖于前一个产生的输出,它就不会运行. 换句话说,有没有办法让我的最后一个命令不运行,直到第五个命令完全完成?这是针对这种情况的代码片段的快速浏览。

        /*Renders user image*/
        //$command_1 = 'cd ./***/; povray +I'.$newname.' +O'.$newname_t.' +D '.$_POST['AA'].' +H75 +W100';
        $command_2 = 'cd ./***/; povray +I'.$newname.' +O'.$newname_i.' +D '.$_POST['AA'].' '.$_POST['resolution'];

        /*Command to copy the .pov, .ini, and .inc files from User_Files to the correct animation directory before frame renders can be done*/
        $command_cp_pov = 'cp ***'.$newname.' ***'.$location;
        $command_cp_ini = 'cp ***'.$newname_j.' ***'.$location;
        $command_cp_inc = 'cp *** ***'.$location;


        /*Render the frames for the animation*/
        $command_3 = 'cd ***'.$location.'; povray +I '.$newname_j.' +A +H384 +W512'.'> /dev/null 2>/dev/null &';

        /*Testing purposes*/
        //echo $command_3."\n";

        /*Throw together the animation using the .png files in the directory*/
        $command_4 = 'cd ***'.$location.'; convert -delay 0 -loop 0 *.png animation.gif'.'> /dev/null 2>/dev/null &';

        /*Testing purposes*/
        //echo $command_4;

        $shellOutput = shell_exec($command_2);
        $shellOutput = shell_exec($command_cp_pov);
        $shellOutput = shell_exec($command_cp_ini);
        $shellOutput = shell_exec($command_cp_inc);
        $shellOutput = shell_exec($command_3);
        // I want this command to run once the previous one is completely finished
        $shellOutput = shell_exec($command_4);

第 5 个 shell_exec 命令正在运行一个 .ini 文件,使用 povray 创建 50 帧场景,这样我就可以使用 ImageMagick 将所有这些帧组合成一个 gif。但它目前无法正常工作,因为我需要一种方法来以某种方式延迟 command_4 的执行,直到 command_3 完全完成(渲染所有 50 帧)。

如果有人想知道所有星号('*')是什么,那只是我在服务器中显示我的实际位置时感到不舒服。对不起,如果这让任何人感到困惑。

4

3 回答 3

1

您可以使用 PHP 的Process API实现此结果。

如果您查看proc_close函数,您会看到它清楚地表明:

proc_close() 等待进程终止,并返回其退出代码。

proc_open 手册页上有一个很好的例子。在执行期间,您可以通过调用proc_get_status获取状态更新。

于 2013-05-05T11:13:38.767 回答
0

如果您改用 exec 并测试返回变量是否成功,然后运行 ​​lastone 会有什么区别

    /*Throw together the animation using the .png files in the directory*/

    /* can you change command to remain in the browser, 
       and report the results rather than writing to dev/null? */
    $command_3 = 'cd ***'.$location.'; povray +I '.$newname_j.' +A +H384 +W512'.'2>&1';


    exec($command_3,$shellOutput,$return_value);
    // I want this command to run once the previous one is completely finished
    if ($return_value === 0){
         $command_4 = 'cd ***'.$location.'; convert -delay 0 -loop 0 *.png animation.gif'.' 2>&1';

         exec($command_4,$shellOutput,$return_value);
         if ($return_value !== 0){
                $failed_result = "An error on 4 ($return) occured.<br>";
                foreach($shellOutput as $v)
                     echo "shelloutput: $v<br>";
         }
    } else {
         $failed_result = "An error on 3 ($return) occured.<br>";
         foreach($shellOutput as $v)
                   echo "shelloutput: $v<br>";
    }
于 2013-04-22T02:48:47.480 回答
0

我不明白您使用的 shell 的语法。但是,如果这有帮助,我从来没有遇到过 bash 如此不耐烦以至于在 povray 大量完成之前的渲染之前启动一个命令的问题。我使用了这样的语法:

重击

对于我在 fracpos04*.pov 中;做povray $i +fn +w1280 +h960 +kff225 +a0.3; 完毕

于 2013-05-05T10:57:27.023 回答