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

Posted

技术标签:

【中文标题】PHP启动的Bash后台进程不起作用【英文标题】:Bash background process initiate by PHP doesn't work 【发布时间】:2012-05-16 10:55:01 【问题描述】:

我需要在后台启动 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 执行上。有想法吗?

编辑: 感谢 Jim Rubenstein 的回复,找到了解决方案:

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

: 替换

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 &

【问题讨论】:

【参考方案1】:

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

php execute a background process

Why this process is not running in background?

【讨论】:

以上是关于PHP启动的Bash后台进程不起作用的主要内容,如果未能解决你的问题,请参考以下文章

TokBox iOS - 应用程序后台进程信号不起作用

如何在 linux 系统上用 PHP 启动后台进程并将用户 ajax 输入重复写入其标准输入

bash后台进程修改全局变量

Bash - 启动和终止进程

在运行后台进程时更改分支会发生啥?

oracle后台进程详解