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