需要shell_exec命令在执行之前等待

时间:2013-04-22 02:42:44

标签: php shell imagemagick shell-exec

我目前遇到的问题是在我想要它之前运行的shell命令。例如,我有6个命令,我都想连续运行,前5个都很好,但是一旦我到达最后一个,它依赖于前一个产生的输出,它赢了&# 39;跑。换句话说,无论如何,我可以让我的最后一个命令没有运行直到第五个完全完成?以下是我对这种情况的代码片段的快速浏览。

        /*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命令使用povray运行.ini文件来创建50帧的场景,然后我可以使用ImageMagick将所有这些帧放在一起形成一个gif。它目前还没有正常工作,因为我需要一种方法以某种方式延迟command_4的执行,直到command_3完全完成(所有50帧都被渲染)。

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

3 个答案:

答案 0 :(得分: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>";
    }

答案 1 :(得分:0)

我不明白你正在使用的shell的语法。但是如果这有帮助的话,我从来没有遇到麻烦,因为在povray完成大批量的前一次渲染之前,bash不耐烦地启动一个命令。我使用这样的语法:

  

的bash

     

for f in fracpos04 * .pov;做povray $ i + fn + w1280 + h960 + kff225 + a0.3;完成

答案 2 :(得分:0)

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

如果您查看proc_close功能,您会看到它明确指出:

  

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

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