Jor*_*eGS 4 cron ruby-on-rails amazon-web-services rake-task amazon-elastic-beanstalk
我正在使用Ruby on Rails 3在AWS中执行cron选项卡 - Elastic Beanstalk,但我不知道出了什么问题.
我在.ebextensions/default.config中有这段代码
container_commands:
01remove_old_cron_jobs:
command: "crontab -r || exit 0"
02send_test_email:
command: crontab */2 * * * * rake send_email:test
leader_only: true
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Failed on instance with return code: 1 Output: Error occurred during build: Command 02send_test_email failed .
Run Code Online (Sandbox Code Playgroud)
更新1
我试过下一个:
crontab.txt
*/2 * * * * rake send_email:test > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)
default.config
02_crontab:
command: "cat .ebextensions/crontab.txt | crontab"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
结果:没有错误,但它不起作用.
更新2
crontab.sh
crontab -l > /tmp/cronjob
#CRONJOB RULES
echo "*/2 * * * * /usr/bin/wget http://localhost/crontabs/send_test_email > /dev/null 2>&1" >> /tmp/cronjob
#echo "*/2 * * * * rake send_email:test > /dev/null 2>&1" >> /tmp/cronjob
crontab /tmp/cronjob
rm /tmp/cronjob
echo 'Script successful executed, crontab updated.'
Run Code Online (Sandbox Code Playgroud)
default.config
02_crontab:
command: "/bin/bash .ebextensions/crontab.sh"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
结果:使用url,但不使用rake任务.
为了使这个能够在最新版本的Elastic Beanstalk上运行,我将以下内容添加到了我的.ebextensions:
.ebextensions/0005_cron.config
files:
"/etc/cron.d/mycron":
mode: "000644"
owner: root
group: root
content: |
56 11 * * * root . /opt/elasticbeanstalk/support/envvars && cd /var/app/current && /opt/rubies/ruby-2.3.4/bin/bundle exec /opt/rubies/ruby-2.3.4/bin/rake send_email:test >> /var/app/current/log/cron.log 2>&1
commands:
remove_old_cron:
command: "rm -f /etc/cron.d/*.bak"
Run Code Online (Sandbox Code Playgroud)
尝试在AWS EB中执行rake任务时,有四个主要问题需要解决:
第一个障碍是确保加载所有EB和Rails环境变量.在这一段时间里,我在墙上撞了一会儿,但后来我发现了这个AWS论坛帖子(可能需要登录).运行. /opt/elasticbeanstalk/support/envvars加载所有环境变量.
然后我们需要确保我们cd进入当前的app目录cd /var/app/current.
接下来我们需要知道在哪里找到bundle和rake可执行文件.它们不是安装在普通bin目录中,而是位于特定于ruby版本的目录中.要找出可执行文件的位置,请将ssh导入EB服务器(eb ssh),然后键入以下内容:
$ cd /var/app/current
$ which bundle
/opt/rubies/ruby-2.3.4/bin/bundle
$ which rake
/opt/rubies/ruby-2.3.4/bin/rake
Run Code Online (Sandbox Code Playgroud)
您可能会根据您的ruby版本猜测目录,但上述命令会让您确定.基于以上所述,您可以将rake命令构建为:
/opt/rubies/ruby-2.3.4/bin/bundle exec /opt/rubies/ruby-2.3.4/bin/rake send_email:test
Run Code Online (Sandbox Code Playgroud)
注意:如果您更新ruby版本,您可能还需要更新您的cron配置.这有点脆.我建议您在自述文件中做一个说明.相信我,六个月后,你会忘记.
要考虑的第四件事是记录.我建议记录到与其他rails日志相同的位置.我们通过添加>> /var/app/current/log/cron.log 2>&1到命令字符串的末尾来完成此操作.
将所有这些放在一起会产生一个cron命令字符串:
. /opt/elasticbeanstalk/support/envvars && cd /var/app/current && /opt/rubies/ruby-2.3.4/bin/bundle exec /opt/rubies/ruby-2.3.4/bin/rake send_email:test >> /var/app/current/log/cron.log 2>&1
Run Code Online (Sandbox Code Playgroud)
最后,我引用了最新的AWS文档来.ebextensions为我的cron命令构建配置文件.结果是.ebextensions/0005_cron.config文件显示在此答案的顶部.
我已经看到它们与 .ebextensions 中的单独文件一起使用,例如:
02send_test_email:
command: "cat .ebextensions/crontab | crontab"
leader_only: true
Run Code Online (Sandbox Code Playgroud)
我还没有抽出时间,但我一路上注意到了这一点。让我们知道这是否有效。
更新1/2后:
Cron 不知道rake在哪里。您的应用程序从 运行/var/app/current,并且您需要bundle exec rake从该目录运行。
Elastic beanstalk 的日志记录错误非常糟糕,为了得到正确的结果,请ssh在机器上进行实验,直到获得正确的命令,然后将其放回 cron 脚本中。您甚至可以尝试重新运行日志中找到的一些 eb 脚本,然后将其反转到您的ebextensions文件中。
| 归档时间: |
|
| 查看次数: |
3292 次 |
| 最近记录: |