首先,我想指出这不是this或this及其他相关问题的重复。我问的是如何得到输出,我的问题主要与此有关。
我需要从PHP运行bash脚本并在PHP中获取其输出。但是,做:
echo shell_exec('script');
由于Apache的FcgidIOTimeout,在第60秒消失。如果我使用以下命令在后台运行它,我将无法获得输出:
shell_exec('<myscript> > /dev/null 2>/dev/null &');
我不能:
shell_exec()
函数的输出写入临时文件,我还需要找到一种方法来验证是否
过程已经完成; 我目前唯一的想法是使用PHP创建一个tmp文件并将输出写入它,然后使用top -c | grep <myscript>
(带有刷新按钮),如果它返回true,那么它仍在进行中。但是,我怀疑在大多数情况下这样做并不实用和有效。
重要的是我使用临时文件而不是实际创建要写入的“永久”文件。
答案 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 &');