Назад | Перейти на главную страницу

Скрипт PHP не работает через cron

Хотя я проверил каноническую проблему для cron, я не смог решить проблему. Почему мой crontab не работает и как я могу устранить его?

Итак, я иду:

У меня есть скрипт php, который запрашивает базу данных MySQL и IBM Informix (расположенную на другом хосте), генерирует файлы json, обрабатывает информацию и вставляет ее в базу данных MySQL.

У сценария есть главный файл и другой файл, в котором есть функции обработки запросов. Оставаясь так:

/opt/project
     script.php
     functions.php

Для script.php требуется файл functions.php, а ген

Я могу запустить сценарий без проблем, используя абсолютный или относительный путь.

Внутри / opt / project:

# php script.php

Где-нибудь еще:

 # /usr/bin/php /opt/project/scrpt.php

Однако, когда он выполняется заданием cron, не работает. Я уже настроил информирующие переменные среды, выполнил тесты журнала и даже создал сценарий оболочки для запуска script.php с cron, запускающим сценарий оболочки.

ПУТЬ сервера (CentOS 7): / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / opt / IBM / informix / bin

Содержимое crontab пробовали:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * /usr/bin/php /opt/project/script.php

С помощью команды root вперед:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * root /usr/bin/php /opt/project/script.php

Смена каталога:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * cd /opt/project && /usr/bin/php script.php

Cron для запуска сценария оболочки напрямую вместо php:

SHELL=/usr/local/bin   
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
*/14 * * * * cd /opt/project && sh run_script.sh

Где сценарий оболочки имеет следующее содержимое:

#!/usr/bin/env bash

cd /opt/project

PHP=`which php`
$PHP script.php

Журналы cron не показали ничего плохого, и если я перенаправляю вывод в файл, он создает файл, но не запускает скрипт php, даже скрипт оболочки для этого. Я пробовал не устанавливать SHELL и PATH в crontab, но тоже не работает.

Я много лет скитался по опустошенной земле в поисках решения. Спасибо, что занялись этой проблемой. Сначала я думал так же, как и вы, но не мог понять, как это исправить. Думаю, это крайний случай. Однако в моем случае; есть небольшая разница в том, что я использую Informix SDK для подключения удаленной базы данных. SDK является обязательным (странным), за исключением языка java (и, возможно, python) (у которого есть собственный драйвер JDBC).

В любом случае, мне просто нужно было установить путь INFORMIXDIR по умолчанию.

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/4.10
0 * * * * root export INFORMIXDIR=/opt/IBM/informix/4.10 && /usr/bin/php /opt/local/myScript.php >> /var/log/myLog.log 2>&1

Проблема заключалась в переменных SDK для подключения к базе данных IBM Infomix. Хотя я установил PATH, было необходимо экспортировать переменные среды из IBM Informix, которые я определил при установке Informix SDK. Странно было то, что даже с исключениями PDO ни одна ошибка не генерировалась, когда я перенаправлял стандартный вывод ошибок с помощью &>.

Может существовать самый элегантный способ сделать это, но я не могу играть с живой средой. Следуйте этой работе cron, которая в настоящее время работает:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
14,29,44,59 * * * * root export INFORMIXSERVER=<data_source_name> && export INFORMIXDIR=<path_to_informix_sdk> && export INFORMIXTMP=<path_infomix_tmp> && export INFORMIXSQLHOSTS=<path_to_sqlhost_file> && export $PATH:$INFORMIXDIR/bin && /usr/bin/php /opt/project/script.php &> /var/log/project/task.log