由 PHP 启动的 Bash 后台进程不起作用


Bash background process initiate by PHP doesn't work

我需要在后台启动OpenOffice服务器(如果它不是实例化(,然后使用JODConverter.
进行文件转换场景如下:

  • 用户通过表单输入 *.html 文件。
  • 我通过 PHP 脚本中对应于表单操作的 $_FILES 变量获取文件
  • 我用 shell_exec 运行一个 bash 脚本,并将临时路径传递给它,以访问我的 bash 脚本中的文件,然后进行转换

这是PHP代码:

        $fichier = $_FILES['html_file'];
        if($fichier) {
            if(is_uploaded_file($fichier['tmp_name'])) {
                if(move_uploaded_file($fichier['tmp_name'],"/var/www/test/doc/".$fichier['name'])) {
                   $output = shell_exec("./converter {$fichier['name']}");
                   echo $output;
                } 
            } 
        } 

脚本"转换器"代码:

#!/bin/bash
fichier=$1
pid=$$
echo RUNNING sOFFICE :
SERVICE=soffice
if P=$(pgrep $SERVICE)
then
    echo sOFFICE IS ALREADY RUNNING 
else
    echo sOFFICE WILL BE START WAIT 5s PLEASE 
    soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard &
    sleep 5
fi
echo CONVERSION START
java -jar ./jodconverter/lib/jodconverter-cli-2.2.2.jar ./$1 ./$1.odt
echo CONVERSION END

我的问题是在 bash 脚本的第一部分,当我尝试在后台运行 sOFFICE 服务器时,即使使用 .
,此命令也会阻止脚本的最终执行&我尝试通过终端运行此脚本,它运行良好。所以我认为,问题出在 bash 脚本的 php 执行上。有想法 ?

编辑 :
由于吉姆·鲁宾斯坦的回应,找到了解决方案:

重定向标准输出和标准错误流

:取代

soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard &

soffice --headless --accept="socket,host=127.0.0.1,port=8100;urp;" --nofirststartwizard > /dev/null 2> /dev/null &

这个问题通常只需在命令末尾添加 & 即可解决;但似乎您还需要重定向标准输出和标准错误流。 我在这里找到了对堆栈溢出的相同问题的回答:

PHP 执行后台进程

为什么此过程不在后台运行?