Хотя я проверил каноническую проблему для 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