使用 dev>null 运行 exec() 命令不起作用,但 dev>null 可以


Running exec() command with dev>null & doesn't work, but dev>null does

我有这个exec命令,它运行良好,但不能释放浏览器(即存在php超时问题,但实际命令继续运行):

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null");

当我运行ps auxw时,我看到这两个正在运行的进程:

sh -c /usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294  >
/usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294

但是,当我运行下面的代码时,浏览器立即免费,但命令不会继续运行:

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null &");

当我运行ps auxw时,我看到一个正在运行的进程在 16 秒后死亡(并且似乎很快耗尽内存并使用大量 CPU%):

/usr/local/php53/bin/php csv.php /tmp/php9Pwu9e 294

然后这个过程在没有实际做任何事情的情况下死亡。不确定 & 符号正在做什么会导致这种情况。

另外,为什么当末尾没有 & 符号时会出现sh -c?我觉得这可能预示着什么,但不知道是什么。

编辑:

因为这不断作为答案出现,我也尝试过:

exec("/usr/local/php53/bin/php csv.php $file $user > /dev/null 2>&1 &");

这证明了与上述相同的问题。下面的代码确实运行,但不会释放浏览器。

exec("usr/local/php53/bin/php csv.php $file $user > /dev/null 2>&1");

试试这个

exec("Nohup PHP CSV.php $file $user>/dev/null &");

尝试将

输出和错误重定向到 /dev/null(或您选择的另一个输出文件,前提是它为运行 Web 服务器的用户设置了写入权限),以及使用与号使其成为后台进程,如 PHP 手册用户说明中所述:

<?php
exec("php /var/www/foo.php > /dev/null 2>&1 &");

刚刚尝试过,它按预期工作:调用脚本立即完成,后台进程继续运行,只要完成。

这个问题比我想象的要简单得多。问题是找不到$file(这是存储在/tmp目录中的上传文件)。我不确定为什么,但我想这与在后台进程到达之前被销毁的文件有关。

解决方案是将文件move_uploaded_file()到永久位置,然后使用该文件运行脚本。这奏效了。