在后台运行shell_exec()并在之后获取其输出

时间:2016-08-07 11:47:40

标签: php bash shell

首先,我想指出这不是thisthis及其他相关问题的重复。我问的是如何得到输出,我的问题主要与此有关。

我需要从PHP运行bash脚本并在PHP中获取其输出。但是,做:

echo shell_exec('script');
由于Apache的FcgidIOTimeout,

在第60秒消失。如果我使用以下命令在后台运行它,我将无法获得输出:

shell_exec('<myscript> > /dev/null 2>/dev/null &');

我不能:

  • 修改bash脚本;
  • 代码和所有功能需要在一个文件中(除非我使用临时文件);
  • 如果我要将shell_exec()函数的输出写入临时文件,我还需要找到一种方法来验证是否 过程已经完成;
  • 使用数据库是一种我无法承受的过度杀伤力;

我目前唯一的想法是使用PHP创建一个tmp文件并将输出写入它,然后使用top -c | grep <myscript> (带有刷新按钮),如果它返回true,那么它仍在进行中。但是,我怀疑在大多数情况下这样做并不实用和有效。

重要的是我使用临时文件而不是实际创建要写入的“永久”文件。

1 个答案:

答案 0 :(得分:3)

  • 类似问题的解决方案:几年前我遇到了类似的问题。我不得不将文件上传到FTP服务器。我想知道如何与FTP服务器通信完全上传文件,以便FTP服务器可以在其上执行一些任务。我的解决方案是在完全上传文件后将文件重命名为* .completed。然后,FTP服务器上的进程只能查找* .completed文件。

  • 根据您的问题调整解决方案:我建议您在bash脚本生成临时文件后重命名该文件。这样,您可以独立地查明脚本是否已成功执行。 shell_exec()可能如下所示:

    shell_exec('<myscript> > tmp-file && mv tmp-file tmp-file.completed &');
    

    请注意,这只会将通道STDOUT重定向到tmp文件中。如果您还想将STDERR重定向到tmp文件,请尝试:

    shell_exec('<myscript> &> tmp-file && mv tmp-file tmp-file.completed &');