PHP脚本未通过cron作业运行

时间:2019-11-03 11:56:46

标签: php cron cron-task

我有一个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作业执行时不起作用。我确实已经设置了通知环境变量,执行日志测试,甚至创建了一个外壳脚本来运行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 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,但是也无法正常工作。

2 个答案:

答案 0 :(得分:1)

请尝试:

* * * * * /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启动的)

答案 1 :(得分:0)

问题是与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