虽然我检查了 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 作业执行时,不起作用。我已经设置了通知环境变量,执行了日志测试,甚至创建了一个 shell 脚本来运行 script.php,并使用 cron 运行该 shell 脚本。
服务器路径(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 ahead 命令:
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 直接运行 shell 脚本而不是 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
其中shell脚本内容如下:
#!/usr/bin/env bash
cd /opt/project
PHP=`which php`
$PHP script.php
cron 日志没有显示任何错误,如果我将输出重定向到文件,它会创建文件,但不会运行 php 脚本,即使使用 shell 脚本也可以。我尝试在 crontab 中不设置 SHELL 和 PATH,但也没有用。
答案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
答案2
多年来,我一直在荒芜之地徘徊,寻找解决方案。感谢您解决了这个问题。最初我的想法和您一样,但不知道该如何解决。我想这是一个极端情况。不过,就我而言,有一点不同,我使用 Informix SDK 连接远程数据库。除了 Java(也许还有 Python)语言(它有自己的 JDBC 驱动程序)外,SDK 是必需的(很奇怪)。
无论如何,我只需要设置默认的 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