我有一个php脚本,用于查询MySQL和IBM Informix数据库(位于其他主机中,生成json文件,处理信息并将其插入MySQL数据库。
该脚本具有一个主文件,另一个具有查询处理功能。保持这样:
/opt/project
script.php
functions.php
script.php需要functions.php文件,根据对数据库的查询生成正在执行的json,并插入处理的数据。
我可以使用绝对或相对路径平稳地运行脚本。
在/ opt /项目内部:
# 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
* * * * * /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
* * * * * 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
* * * * * cd /opt/project && /usr/bin/php script.php
Cron直接运行Shell脚本而不是php:
SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * cd /opt/project && sh run_script.sh
其中shell脚本具有以下内容:
#!/usr/bin/env bash
cd /opt/project
PHP=`which php`
$PHP script.php
cron日志没有显示任何错误,如果我将输出重定向到文件,它将创建该文件,但没有运行php脚本,甚至没有通过shell脚本执行此操作。我尝试在crontab中未设置SHELL和PATH,但也无法正常工作。
请尝试:
* * * * * /full/path/to/your/run_script.sh
代替:
* * * * * cd /opt/project && sh run_script.sh
如果要执行bash或sh脚本,则该脚本的路径应为上述绝对路径或:
./run_script.sh
注意./
。否则脚本将不会执行。
还可以通过以下方式使您的bash脚本可执行:
chmod +x run_script.sh
您也可以直接运行脚本,而无需cron提供run_script.sh
:
* * * * * /absolute/path/to/php -f "/absolute/path/to/script.php"
用于将当前目录更改为您的php脚本所在的目录,您可以在php脚本的开头使用此目录:
chdir(dirname(__FILE__));
因为当您通过cron运行php脚本时,php的当前目录不是脚本而是不同的(由于它是由cron启动的)
问题是与IBM Infomix数据库连接的SDK变量。尽管已经设置了PATH,但是有必要从我在安装Informix SDK时定义的IBM Informix导出环境变量。奇怪的是,即使使用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