单行多个后台进程在前台运行

单行多个后台进程在前台运行

我想将上传的 PDF 文件转换为 JPG 图像,并在转换过程完成后压缩这些图像。我使用ImageMagick库的convert命令进行 PDF 到 JPG 的转换。

为了实现这一点,我使用&&如下操作数:

convert /tmp/asdassa_1395994117.pdf -density 200 /tmp/files/asdassa_1395994117.pdf.jpg && zip -r /tmp/files/files.zip /tmp/files/* &

除了一件事之外,这个命令工作正常:它在前台运行,因此服务器在它完成之前不会响应。

如果我使用其中任何一个命令,并&在命令末尾添加,它会在后台运行,我可以尽快得到响应。但是当一起使用时,情况并非如此。

我是不是漏掉了什么?可能是关于命令类型?因为使用和这样的简单命令测试和操作数&&在后台运行,正如我所期望的那样,例如这个命令:&sleepmkdir

sleep 10 && mkdir bla &

10秒后进入后台并创建bla目录。

PS 我的服务器在 Amazon Linux AMI 2013.03 上运行

编辑:事实证明,问题不在于操作系统,而在于exec()PHP 的功能。请查看我的答案,看看我是如何解决这个问题的。

答案1

所以事实证明,问题不在于我如何使用命令,而在于我如何使用 PHP 命令。

我这样做是这样的:

exec($command);

但是,我后来发现该exec()命令并不喜欢这种用法。因此,我决定将命令放入临时.sh文件并使用它,而不是直接传递该命令exec()

// create the command, don't forget to delete the temporary file with a last command
$command = "convert /tmp/asdassa_1395994117.pdf -density 200 /tmp/files/asdassa_1395994117.pdf.jpg && zip -r /tmp/files/files.zip /tmp/files/* && rm /tmp/temp.sh";

// create file with this command
exec("echo '".$command."' > /tmp/temp.sh");

// execute on the background with output
exec("sh /tmp/temp.sh > /dev/null 2>&1 & echo $!");

效果很好。

相关内容