【问题标题】:Elastic Beanstalk - Cron job is running but not executingElastic Beanstalk - Cron 作业正在运行但未执行
【发布时间】:2014-05-27 09:53:27
【问题描述】:

这是我第一次在 Elastic Beanstalk (EB) 上运行 cron 作业。部署我的代码后,似乎 cron 作业已创建并正在运行,但 PHP 脚本未正确执行。这是我的设置。

在我的.ebextensions 文件夹中,我有一个名为01run.config 的文件。

container_commands:
  01_remove_old_cron_jobs:
    command: "crontab -r || exit 0"
  02_cronjobs:
    command: "cat .ebextensions/cron_jobs.txt > /etc/cron.d/cron_job && chmod 644 /etc/cron.d/cron_job"
    leader_only: true

在我的.ebextensions 文件夹中,我还有一个cron_jobs.txt 文件。请注意,按照另一个 stackoverflow 帖子的指示,我在此文件末尾有一个换行符。在下面的示例中,我以ec2-user 运行命令,但我也尝试了root

* * * * * ec2-user /usr/bin/php -q /var/app/current/tests/cron.php

部署我的代码后,我可以看到文件/etc/cron.d/cron_job 已创建。当我运行 sudo tail /var/log/cron 时,我还可以看到每分钟运行的 cron 作业。

[ec2-user@ip-xxx-xxx-xxx-xxx ~]$ sudo tail /var/log/cron
Apr 13 12:54:53 ip-xxx-xxx-xxx-xxx crontab[26093]: (root) DELETE (root)
Apr 13 12:55:01 ip-xxx-xxx-xxx-xxx crond[1230]: (*system*) RELOAD (/etc/cron.d/cron_job)
Apr 13 12:55:01 ip-xxx-xxx-xxx-xxx CROND[26128]: (ec2-user) CMD (/usr/bin/php -q /var/app/current/tests/cron.php)
Apr 13 12:56:01 ip-xxx-xxx-xxx-xxx CROND[26139]: (ec2-user) CMD (/usr/bin/php -q /var/app/current/tests/cron.php)

/var/app/current/tests/cron.php 内,我有一些代码可以将一行添加到 MySQL 数据库(托管在 RDS 上)。但是没有任何东西被添加到数据库中。

然后我尝试直接通过终端窗口运行 cron 命令:

$ /usr/bin/php -q /var/app/current/tests/cron.php

它运行没有错误并将记录添加到数据库中。我在终端以ec2-user 登录。

我错过了什么吗?还是我的 cron 作业代码设置不正确?

【问题讨论】:

  • 您的数据库在哪里运行? RDS?
  • @Rico RDS。是某种权限问题吗?
  • 可能是。看起来很奇怪,你介意发布cron.php 的代码吗?另外,cron.php 是否会吐出任何调试信息?
  • 啊哈!我发现了这个问题。我的系统依赖 环境变量 PARAM1 来确定数据库信息。当 cron 作业运行时,这些变量不会被传递。你知道这是否可能吗?还是我必须想出另一个解决方案?
  • 我最终使用wget 运行似乎添加变量的 cron。所以我想我很高兴 :) 感谢您的帮助!

标签: php amazon-web-services amazon-ec2 cron


【解决方案1】:

我在尝试访问 AWS RDS 数据库的 php 脚本时遇到了类似的问题。您的 php 脚本是否使用 $_SERVER['RDS_xxxx'] 获取数据库详细信息?如果是这样,那些RDS_xxxx变量在cron运行php脚本时环境中不存在。

为了解决这个问题,我将变量添加到 cron 文件的开头:

RDS_HOSTNAME=<my_database_hostname>
RDS_PORT=<my_database_port>
RDS_USERNAME=<my_database_username>
RDS_PASSWORD=<my_database_password>
RDS_DB_NAME=<my_database_name>

* * * * * php /path/to/my/script.php

【讨论】:

    【解决方案2】:

    通过 SSH 登录并检查生成的 cron 作业文件/etc/cron.d/cron_job 是否有 unix 行结尾,即 ASCII text 不是 win 即 ASCII text, with CRLF line terminators

    要检查行尾,请参阅answer here

    注意:如果你有windows行尾,那么你必须转换文件.ebextensions/cron_jobs.txt的行尾,因为你可以使用dos2unix或类似的程序。

    【讨论】:

      【解决方案3】:

      我在 AWS 上的 RDS_ 变量也遇到了类似的问题,我关注了 this 的讨论并且它有效。 这是我之前的 cronjob:

      RDS_HOSTNAME=<my_database_hostname> 
      RDS_PORT=<my_database_port>
      RDS_USERNAME=<my_database_username>
      RDS_PASSWORD=<my_database_password> 
      RDS_DB_NAME=<my_database_name>
      * * * * * cd /var/app/current && bin/cake notifications send_push >> /var/tmp/notifications.log 2>&1
      

      然后改成这样:

      * * * * * . /opt/elasticbeanstalk/support/envvars cd /var/app/current && bin/cake notifications send_push >> /var/tmp/notifications.log 2>&1
      

      现在我可以像这样访问它们:$_SERVER['RDS_HOSTNAME']

      【讨论】:

        猜你喜欢
        • 2016-11-26
        • 2016-11-25
        • 1970-01-01
        • 2019-05-13
        • 2023-03-31
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多