Amazon Elastic Beanstalk中的Crontab

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任务.

Tom*_*nda 9

更新于2018年

为了使这个能够在最新版本的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任务时,有四个主要问题需要解决:

  1. 第一个障碍是确保加载所有EB和Rails环境变量.在这一段时间里,我在墙上撞了一会儿,但后来我发现了这个AWS论坛帖子(可能需要登录).运行. /opt/elasticbeanstalk/support/envvars加载所有环境变量.

  2. 然后我们需要确保我们cd进入当前的app目录cd /var/app/current.

  3. 接下来我们需要知道在哪里找到bundlerake可执行文件.它们不是安装在普通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配置.这有点脆.我建议您在自述文件中做一个说明.相信我,六个月后,你会忘记.

  4. 要考虑的第四件事是记录.我建议记录到与其他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文件显示在此答案的顶部.

  • “ / opt / rubies / ruby​​-current”已链接到最新Beanstalk红宝石机器上的当前红宝石版本,因此您可以使用它代替特定红宝石版本的路径。 (2认同)

kro*_*oss 0

我已经看到它们与 .ebextensions 中的单独文件一起使用,例如:

  02send_test_email:
    command: "cat .ebextensions/crontab | crontab"
    leader_only: true
Run Code Online (Sandbox Code Playgroud)

我还没有抽出时间,但我一路上注意到了这一点。让我们知道这是否有效。

这篇 stackoverflow 帖子有更多信息

更新1/2后:

Cron 不知道rake在哪里。您的应用程序从 运行/var/app/current,并且您需要bundle exec rake从该目录运行。

Elastic beanstalk 的日志记录错误非常糟糕,为了得到正确的结果,请ssh在机器上进行实验,直到获得正确的命令,然后将其放回 cron 脚本中。您甚至可以尝试重新运行日志中找到的一些 eb 脚本,然后将其反转到您的ebextensions文件中。