Длительный процесс php с & #39;at& #39; ведет себя очень странно

Во-первых, я я далеко не эксперт по Linux, так что это может быть проблемой здесь, но в любом случае, к проблеме:

я следовал тому, что написано здесь :http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

, чтобы запустить долгий -работающий процесс PHP. Это безупречно работает в моей конфигурации MAMP на моем Mac. Однако, как только я развернул его на нашем VPS, я получил действительно странные результаты.

Итак, сначала я делаю простой тест, используя SSH-соединение.:

echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes

Результат:

warning: commands will be executed using /bin/sh
job 2300 at 2012-04-29 19:24

И действительно, через 2 минуты выполняется php-скрипт. Все идет нормально.

Затем я пробую следующий подход:

в своем браузере я открываю:

www.myserver.com/Update/LaunchUpdates.php

этот php-скрипт содержит строку:

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

Происходит следующее :Я проверяю состояние -l и вижу :

job 2304 at 2012-04-29 19:32

. Затем жду 2 минуты и снова запускаю -l. Я ожидаю увидеть пустой результат, но вместо этого получаю :

job 2305 at 2012-04-29 19:34

, а через 2 минуты получаю

job 2306 at 2012-04-29 19:36

. У меня нет ни малейшего представления о том, что там происходит. PHP-скрипт не выполняется, и задание, похоже, перепланируется через 2 минуты. И так продолжается до тех пор, пока я не приступаю к работе.

Кто-нибудь знает, что происходит?

Еще немного информации:

cat /etc/*-release
Gentoo Base System version 1.6.14

Еще немного информации. Вот содержимое задания at, когда оно запланировано:(в -c [ID])

#!/bin/sh
# atrun uid=1002 gid=100
# mail user 1
umask 33
SERVER_SIGNATURE=\Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o\ Server\ at\ xxx.yyyyy.com\ Port\ 80\"
"; 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;

При ожидании перепланирования задания через 2 минуты я получаю содержимое нового задания, и оно идентично, за исключением:

SHLVL=764, который стал SHLVL=765

Подробнее!

По предложению пользователя я попытался использовать nohup вместо at. Итак, я сделал следующее:

Сгенерировал команду для запуска nohup в файле.sh (с разрешениями на выполнение ).а затем выполнить 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

мой php-код LaunchUpdates содержит:

$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 &');

Ничего не происходит:

Я закомментировал строку exec в своем php-скрипте, чтобы файл не выполнялся, а генерировался. Я тестирую файл вручную, войдя в систему с помощью ssh, перейдя на пользователя «пользователь» и запустив:

nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &

все работает нормально (, и файл.sh удаляется в конце )!

Затем я раскомментирую строку exec и перезапущу php-скрипт. process.out содержит :

Process still running. Try again later!

. Это означает, что он снова выполняет базовый сценарий -, а не оператор exec??? Я ПОЛНОСТЬЮ потерялся здесь! Поскольку в обеих учетных записях я запускаю один и тот же сценарий bash, не может быть ошибки в отношении того, какие команды выполняются.

Должен ли я начать копаться в журналах Apache?

Это должно было занять мало времени, мальчик был я неправ....

10
задан Joris Mans 6 May 2012 в 14:14
поделиться