尝试在后台从php运行shell脚本


Trying to run a shell script from php in the background

我有一个PHP脚本,它访问一个数据库表,其中包含一些需要下载的大文件的信息。我打算将这个PHP脚本作为cron作业每小时运行一次,每次运行时,它都应该做以下事情:

  1. 检查是否有需要下载的文件
  2. 如果有的话,执行一个shell脚本,它会发出一个wget命令,并在后台开始下载文件,准备好后,运行第二个php脚本,更新下载完成时的数据库表,并获取该shell脚本的进程id,以备日后使用
  3. 检查当前是否有正在下载的文件,如果有,请检查其进程id是否仍处于活动状态,如果没有,请调整表,以便我们知道下载中的某个位置发生了错误

shell脚本相应地工作,如果我从控制台运行它,一切都很好,我也会在我的php文件中返回shell脚本的进程id,我的问题是,当原始php文件存在时,它启动的shell脚本也会停止。

以下是我在php中用来启动shell脚本的代码:

function runProcess($command, &$output=array()) {
    $command =  $command . ' > /dev/null 2>&1 & echo $!';
    echo $command . "<BR>";
    return exec($command, $output);
}
/** excerpt from the class that does the processing */
$pid=runProcess("sh ".self::DOWNLOAD_FILE_SHELL." ".DEFAULT_DIR_WHOME." 1.xml ".$this->Parent->XMLPath, $output));
echo $pid;

我的问题如下:即使父进程(php脚本)退出,我如何才能强制shell脚本继续运行

如果您在类似UNIX的环境中运行,那么最简单的方法是在命令行末尾添加&符号。这将告诉shell运行该命令,而不是等待完成。试试这个:

$command =  $command . ' > /dev/null 2>&1 & echo $! &';