【问题标题】:PHP Script is not running via cron jobPHP 脚本未通过 cron 作业运行
【发布时间】:2020-02-28 23:19:45
【问题描述】:

我有一个查询 MySQL 和 IBM Informix 数据库(位于其他主机)的 php 脚本,生成 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,但也不起作用。

【问题讨论】:

  • error_reporting 设置为E_ALL。还要删除这个which php,而是调用/usr/bin/env php script
  • @MarcinOrlowski 我做了测试但没有工作。脚本没有错误。即使设置shebang并使用绝对路径调用'./opt/project/script.php',也会调用cron jog但未执行脚本。

标签: php cron cron-task


【解决方案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

你也可以在没有run_script.sh from cron 的情况下直接运行脚本:

* * * * * /absolute/path/to/php -f "/absolute/path/to/script.php"

要将当前目录更改为您的 php 脚本所在的目录,您可以在 php 脚本的开头使用它:

chdir(dirname(__FILE__));

因为当你通过cron运行php脚本时,php的当前目录不是脚本而是不同的(因为它是由cron启动的)

【讨论】:

  • 我进行了更改。我检查了在执行脚本路径的任何位置设置 chdir 将是脚本所在的位置。 cron作业被执行,我可以看到日志,如果我在shell脚本中输入一些输出,就会创建带有内容的文件,但是通过shell运行scrpt.php或直接在crontab -e中设置它不起作用。我已经在 /etc/init.d 和 /etc/crontab 下设置了 cron 作业,使用 root ahead 命令。
  • 如果我设置了一个 cron 作业来输出我的 cron 环境,我会看到我在作业之前设置的 PATH 和 SHELL 变量。
  • @LeandroArruda 你试过/absolute/path/to/php -f "/absolute/path/to/script.php" 吗?结果如何?
  • 是的。我用双引号括起来。该脚本手动运行,我使用 root 用户设置了 cron 作业。
【解决方案2】:

问题在于用于连接 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2019-07-23
    • 2018-06-11
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多