【问题标题】:Crontab in Amazon Elastic BeanstalkAmazon Elastic Beanstalk 中的 Crontab
【发布时间】:2013-12-05 17:25:00
【问题描述】:

我正在 AWS - Elastic Beanstalk 中使用 Ruby on Rails 3 做一个 cron 选项卡,但我不知道出了什么问题。

我的 .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

我收到此错误:

Failed on instance with return code: 1 Output: Error occurred during build: Command 02send_test_email failed .

更新 1

接下来我尝试了:

crontab.txt

*/2 * * * * rake send_email:test > /dev/null 2>&1

default.config

02_crontab:
  command: "cat .ebextensions/crontab.txt | crontab"
  leader_only: true

结果:没有错误,但它不起作用。

更新 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.'

default.config

02_crontab:
  command: "/bin/bash .ebextensions/crontab.sh"
  leader_only: true

结果:适用于 url,但不适用于 rake 任务。

【问题讨论】:

    标签: ruby-on-rails amazon-web-services cron amazon-elastic-beanstalk rake-task


    【解决方案1】:

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

      02send_test_email:
        command: "cat .ebextensions/crontab | crontab"
        leader_only: true
    

    我还没有接触到它,但我一路上注意到了这一点。让我们知道这是否有效。

    This stackoverflow post has much more information

    更新 1/2 之后:

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

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

    【讨论】:

    • 对我没有用。我有一个带有*/2 * * * * rake send_email:test > /dev/null 2>&1 的 crontab.txt,什么也没有。没有错误,但没有工作。
    • 参见更新 1 和更新 2。
    • /var/app/current 运行bundle exec 的任何示例?
    【解决方案2】:

    我也有同样的问题。虽然我发现 rake 任务无法在 eb 上正确运行的原因是因为 RACK_ENV、RAILS_ENV 和 BUNDLE_WITHOUT
    eb的默认值:

    RACK_ENV: production
    RAILS_ENV: production
    BUNDLE_WITHOUT: test:development
    

    当 cron 运行 rake 任务时,它在开发模式下运行,并给出 gem not found 错误,因为在开发中分组的 gem 没有安装。

    您可以通过稍微更改您的 cron 来查看这一点
    来自:

    */2 * * * * rake send_email:test > /dev/null 2>&1
    

    到:

    */2 * * * * cd /var/app/current/ && /usr/bin/bundle exec /usr/bin/rake send_email:test > /tmp/cron_log 2>&1
    

    然后检查 /tmp/cron_log 文件
    要知道 bundle 和 rake 的位置,运行

    which bundle
    which rake
    

    我尝试在 cron 的命令中设置 RAILS_ENV,但效果不佳
    一种快速解决方法是设置

    BUNDLE_WITHOUT to null
    

    编辑:

    终于搞定了,

    .ebextensions/.config

    files:
      "/tmp/cron_jobs" :
        mode: "000777"
        content: |
          1 10 * * * cd /var/app/current/ && RACK_ENV=production rake some:task >> /var/app/current/log/cron_log 2>&1
        encoding: plain
    container_commands:
      01_delete_cron_jobs:
        command: "crontab -r -u webapp || exit 0"
      02_add_cron_jobs:
        command: "crontab /tmp/cron_jobs -u webapp"
        leader_only: true
    option_settings:
      - option_name: RAILS_ENV
        value: production
      - option_name: RACK_ENV
        value: production
    

    在删除和添加 cron 时请注意“-u webapp”,这将在用户 webapp 下运行此 cron。以上也将在生产模式下运行。并且输出将被转储到 log/cron_log 文件中。

    如果上述方法不起作用,那么在 'rake some:task' 之前添加 'Bundle exec' 可能会起作用。

    【讨论】:

      【解决方案3】:

      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"
      

      我是如何到达那里的:

      在 AWS EB 中尝试 cron rake 任务时要面对四个主要问题:

      1. 第一个障碍是确保加载所有 EB 和 Rails 环境变量。我在这个上撞了一会儿,但后来我发现了this AWS forum post(可能需要登录)。运行 . /opt/elasticbeanstalk/support/envvars 会加载所有环境变量。

      2. 然后我们需要确保我们使用cd /var/app/currentcd进入当前应用目录。

      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
        

        你可能会根据你的 ruby​​ 版本猜出目录,但上面的命令会让你确定。基于上述,您可以将您的 rake 命令构建为:

        /opt/rubies/ruby-2.3.4/bin/bundle exec /opt/rubies/ruby-2.3.4/bin/rake send_email:test
        

        注意:如果您更新 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
      

      最后,我引用了最新的AWS documentation 来为我的cron 命令构建一个.ebextensions 配置文件。结果是显示在此答案顶部的.ebextensions/0005_cron.config 文件。

      【讨论】:

      • 由于您正在加载环境变量,我认为您应该能够使用$RUBY_ROOT 代替实际路径(例如/opt/rubies/ruby-2.3.4)以避免“为什么没有”的最终痛苦这个任务不是一直在运行吗?”当 Ruby 版本不可避免地更新时。
      • @Matt,好主意。我还没有时间测试它,但是如果您有信心,请随时编辑此答案。
      • /opt/rubies/ruby-current 链接到最近 Beanstalk ruby​​ 机器上的当前 ruby​​ 版本,因此您可以使用它而不是特定 ruby​​ 版本的路径。
      • 一个更详细的命令字符串,但没有硬连线路径:. $(/opt/elasticbeanstalk/bin/get-config container -k support_dir)/envvars && cd $(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir) && . $(/opt/elasticbeanstalk/bin/get-config container -k script_dir)/use-app-ruby.sh && bundle exec rake -T
      • 如果它可以帮助任何人,我的 Node.js Amazon Linux 2 环境没有 envvars 文件。 get-config 是一个替代方案,但它尚未在 Amazon Linux 2 上(截至 2020 年 6 月)。在这里可以找到对我有帮助的解决方法:github.com/awsdocs/elastic-beanstalk-samples/issues/…
      猜你喜欢
      • 2018-10-13
      • 2014-12-15
      • 1970-01-01
      • 2013-06-12
      • 2015-02-23
      • 2014-05-21
      • 2018-02-27
      • 2014-06-07
      • 2011-09-06
      相关资源
      最近更新 更多