php长时间运行的过程与'at'表现得非常奇怪

Jor*_*ans 10 php linux gentoo

首先,我远离Linux专家,所以这可能是问题,但无论如何,问题是:

我按照这里写的内容:http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

启动一个长期运行的PHP进程.这在我的Mac上的MAMP配置中完美无瑕.然而,一旦我将它部署到我们的VPS,我得到了一些非常奇怪的结果.

首先,我使用SSH连接进行简单的测试:

echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes
Run Code Online (Sandbox Code Playgroud)

结果:

warning: commands will be executed using /bin/sh
job 2300 at 2012-04-29 19:24
Run Code Online (Sandbox Code Playgroud)

事实上,2分钟后执行php脚本.到现在为止还挺好.

接下来我尝试以下方法:

在我的浏览器中我打开:

www.myserver.com/Update/LaunchUpdates.php
Run Code Online (Sandbox Code Playgroud)

这个php脚本包含以下行:

exec("echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes");
Run Code Online (Sandbox Code Playgroud)

会发生以下情况:我在-l处检查状态,我看到:

job 2304 at 2012-04-29 19:32
Run Code Online (Sandbox Code Playgroud)

然后我等了2分钟再次跑到-l.我希望看到一个空的结果,但我得到:

job 2305 at 2012-04-29 19:34
Run Code Online (Sandbox Code Playgroud)

2分钟后我得到了

job 2306 at 2012-04-29 19:36
Run Code Online (Sandbox Code Playgroud)

我对那里发生的事情一无所知.PHP脚本没有执行,工作似乎在2分钟后重新安排.这种情况一直持续到我工作为止.

有谁知道可能会发生什么?

更多信息:

cat /etc/*-release
Gentoo Base System version 1.6.14
Run Code Online (Sandbox Code Playgroud)

更多细节.以下是at job安排时的内容:( at -c [ID])

#!/bin/sh
# atrun uid=1002 gid=100
# mail user 1
umask 33
SERVER_SIGNATURE=\<address\>Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o\ Server\ at\ xxx.yyyyy.com\ Port\ 80\</address\>"
"; export SERVER_SIGNATURE
HTTP_USER_AGENT=Mozilla/5.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10_7_3\)\ AppleWebKit/534.55.3\ \(KHTML,\ like\ Gecko\)\ Version/5.1.5\ Safari/534.55.3; export HTTP_USER_AGENT
HTTP_HOST=xxx.yyyyy.com; export HTTP_HOST
SERVER_PORT=80; export SERVER_PORT
DOCUMENT_ROOT=/home/user/www; export DOCUMENT_ROOT
SCRIPT_FILENAME=/home/user/www/Update/LaunchUpdates.php; export SCRIPT_FILENAME
REQUEST_URI=/Update/LaunchUpdates.php; export REQUEST_URI
SCRIPT_NAME=/Update/LaunchUpdates.php; export SCRIPT_NAME
HTTP_CONNECTION=keep-alive; export HTTP_CONNECTION
REMOTE_PORT=36291; export REMOTE_PORT
PATH=/bin:/usr/bin; export PATH
PWD=/home/user/www/Update; export PWD
SERVER_ADMIN=webmaster@abcdef.com; export SERVER_ADMIN
REDIRECT_STATUS=200; export REDIRECT_STATUS
HTTP_ACCEPT_LANGUAGE=en-us; export HTTP_ACCEPT_LANGUAGE
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml\;q=0.9,\*/\*\;q=0.8; export HTTP_ACCEPT
REMOTE_ADDR=83.101.41.41; export REMOTE_ADDR
SHLVL=764; export SHLVL
SERVER_NAME=xxx.yyyyy.com; export SERVER_NAME
SERVER_SOFTWARE=Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o; export SERVER_SOFTWARE
QUERY_STRING=; export QUERY_STRING
SERVER_ADDR=1.2.3.4; export SERVER_ADDR
GATEWAY_INTERFACE=CGI/1.1; export GATEWAY_INTERFACE
SERVER_PROTOCOL=HTTP/1.1; export SERVER_PROTOCOL
HTTP_ACCEPT_ENCODING=gzip,\ deflate; export HTTP_ACCEPT_ENCODING
REQUEST_METHOD=GET; export REQUEST_METHOD
cd /home/user/www/Update || {
     echo 'Execution directory inaccessible' >&2
     exit 1
}
/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;
Run Code Online (Sandbox Code Playgroud)

在等待工作重新安排2分钟后,我得到新工作的内容,除了:

SHLVL = 764已成为SHLVL = 765

更多信息!

正如用户建议我尝试使用nohup而不是at.所以我做的是以下内容:

生成由.h文件中的nohup运行的命令(具有执行权限).然后做exec('nohup .....')

我在LaunchUpdates还增加了一个检查,以确保它不叫再nohup的一批做运行前(我基本的RM .SH文件及其批结束,并在LaunchUpdates我检查该文件是否存在).

所以简而言之.

batchProcess.sh包含:

/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php; 
rm /home/user/batchProcess.sh
Run Code Online (Sandbox Code Playgroud)

我的LaunchUpdates php代码包含:

$batchFile = "/home/user/batchProcess.sh";

if (file_exists($batchFile))
{
    echo 'Process still running. Try again later!';
    exit;
}

exec('nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &');
Run Code Online (Sandbox Code Playgroud)

没有发生什么:

我在我的php脚本中注释掉exec行,所以文件没有被执行但是生成了.我通过使用ssh登录手动测试文件,更改为用户"user"并运行:

nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &
Run Code Online (Sandbox Code Playgroud)

一切正常(最后删除.sh文件)!

接下来,我取消注释exec行并重新运行php脚本.process.out包含:

Process still running. Try again later!
Run Code Online (Sandbox Code Playgroud)

这意味着它再次执行基本脚本而不是exec语句??? 我完全迷失在这里!因为在两个帐户上我运行相同的bash脚本,所以执行什么命令都没有错误.

我应该开始挖掘apache日志吗?

这应该花很少的时间,男孩是我错了....

sym*_*ean 2

我假设您在运行时以 root 身份登录(或 uid PHP 在网络服务器中运行)at -l,并且作业与 uid PHP 在网络服务器中运行相关联?

但是,其他人可能正在访问该网页,因为新作业的添加间隔与初始运行的延迟相同,这让我认为 Update.php 可能正在调用命令来再次运行自身?