Во-первых, я далек от эксперта 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 script. Пока все хорошо.
Далее я пробую следующий подход:
в моем браузере я открываю:
www.myserver.com/Update/LaunchUpdates.php
этот php script содержит строку:
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 script не выполняется, и работа, похоже, перепланирует себя через 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=\<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
[email protected]; 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 вместо. Итак, я сделал следующее:
Сгенерируйте команду, которую должен выполнить 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!
Это означает, что он снова выполняет base- script, а не оператор exec??? Я ПОЛНОСТЬЮ потерял здесь! Поскольку на обеих учетных записях я запускаю те же bash script, не может быть ошибки относительно того, какие команды выполняются.
Должен ли я начинать копать в журналах apache?
Предполагалось, что у вас мало времени, мальчик был я неправ.