PHP 脚本不是 运行 通过 cron 作业
PHP Script is not running via cron job
我有一个 php 脚本查询 MySQL 和 IBM Informix 数据库(位于其他主机),生成 json 文件,处理信息并将其插入 MySQL 数据库.
该脚本有一个主文件和另一个具有查询处理功能的文件。保持这样:
/opt/project
script.php
functions.php
script.php需要functions.php文件,根据对数据库的查询生成json正在执行的地方,并插入处理的数据。
我可以运行使用绝对或相对路径顺利地编写脚本。
里面 /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
* * * * * /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
我有一个 php 脚本查询 MySQL 和 IBM Informix 数据库(位于其他主机),生成 json 文件,处理信息并将其插入 MySQL 数据库.
该脚本有一个主文件和另一个具有查询处理功能的文件。保持这样:
/opt/project
script.php
functions.php
script.php需要functions.php文件,根据对数据库的查询生成json正在执行的地方,并插入处理的数据。
我可以运行使用绝对或相对路径顺利地编写脚本。
里面 /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
* * * * * /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