Elastic Beanstalk - Cron作业正在运行但未执行

时间:2014-04-13 13:08:55

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

这是我第一次在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作业代码设置错误了吗?

3 个答案:

答案 0 :(得分:4)

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

为了解决这个问题,我将变量添加到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

答案 1 :(得分:1)

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

要检查行结尾,请参阅answer here

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

答案 2 :(得分:1)

我在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']