【问题标题】:Whenever Gem AWS elastic beanstalk每当 Gem AWS 弹性豆茎
【发布时间】:2018-01-09 05:41:41
【问题描述】:

抱歉,如果这是重复的 - 有一些类似问题的结果,但大多数答案都过时了,我无法让它发挥作用。

我在我的 rails 应用程序中使用when gem 每小时运行一个任务,但我似乎无法让AWS 正确配置Cron 设置。

我的第一个想法是通过 SSH 连接到实例并运行每次更新 /write 命令,该命令运行良好,但我的任务没有运行。

在这里查看旧问题后,我创建了一个带有配置文件的 ebextensions 文件夹来运行更新命令,但仍然没有乐趣。我使用了这个配置脚本,但不太了解它,所以我认为我没有正确设置它 - 有人可以帮忙吗?

files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_update_cron.sh"
mode: "000755"
owner: root
group: root
content: |
#! /usr/bin/env bash
. /opt/elasticbeanstalk/containerfiles/envvars
su -c "cd $EB_CONFIG_APP_CURRENT; bundle exec whenever --update-cron" 
- $EB_CONFIG_APP_USER

编辑添加的日志

2018-01-09T23:24:45.282Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AppDeployStage1/AppDeployPostHook] : Starting activity...
[2018-01-09T23:24:45.282Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AppDeployStage1/AppDeployPostHook/01_cron.sh] : Starting 
activity...
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AppDeployStage1/AppDeployPostHook/01_cron.sh] : Completed 
activity. Result:
[write] crontab file updated
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AppDeployStage1/AppDeployPostHook] : Completed activity. 
Result:
Successfully execute hooks in directory 
/opt/elasticbeanstalk/hooks/appdeploy/post.
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AppDeployStage1] : Completed activity. Result:
Application version switch - Command CMD-AppDeploy stage 1 completed
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter] : Starting activity...
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter/ConfigLogRotation] : Starting activity...
[2018-01-09T23:24:46.618Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter/ConfigLogRotation/10-config.sh] : Starting 
activity...
[2018-01-09T23:24:46.778Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter/ConfigLogRotation/10-config.sh] : Completed 
activity. Result:
Disabled forced hourly log rotation.
[2018-01-09T23:24:46.779Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter/ConfigLogRotation] : Completed activity. 
Result:
Successfully execute hooks in directory 
/opt/elasticbeanstalk/addons/logpublish/hooks/config.
[2018-01-09T23:24:46.779Z] INFO  [1641]  - [Application update app-5c64-
180109_162309@15/AddonsAfter] : Completed activity.
[2018-01-09T23:24:46.779Z] INFO  [1641]  - [Application update app-5c64-

编辑 2 我现在形成以下错误的新配置代码:

commands:
 70.1-create-post-dir:
  # "mkdir -p" ignores error if directory already exists
  command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post"

files:
 "/opt/elasticbeanstalk/hooks/appdeploy/post/01_cron.sh":
 mode: "000755"
 owner: root
 group: root
 content: |
  #!/usr/bin/env bash

  # Load environment data
  EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
  EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir) 
  EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
  EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
  # Export EB_APP_LOG_DIR so we can access it when running "whenever" below,
  # which accesses config/schedule.rb, which uses EB_APP_LOG_DIR.
  export EB_APP_LOG_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)

  # Make sure the cron-whenever.log exists and is owned by $EB_APP_USER
  touch $EB_APP_LOG_DIR/cron-whenever.log
  chown $EB_APP_USER:$EB_APP_USER $EB_APP_LOG_DIR/cron-whenever.log

  # cron requires a home directory.  Make sure it exists and is owned by $EB_APP_USER.
  mkdir -p /home/$EB_APP_USER
  chown $EB_APP_USER:$EB_APP_USER /home/$EB_APP_USER

  # Set up correct environment and ruby version so that bundle can load all gems
  . $EB_SUPPORT_DIR/envvars
  . $EB_SCRIPT_DIR/use-app-ruby.sh

  # Run the whenever --update command to update the cron job for $EB_APP_USER.
  cd $EB_APP_DEPLOY_DIR
  whenever --update -u $EB_APP_USER

  # After setup, you can run "crontab -l -u webapp" to check the configuration.

【问题讨论】:

    标签: ruby-on-rails amazon-web-services whenever


    【解决方案1】:

    首先 - 你的 .config 文件是这样格式化的吗?该文件采用 YAML 格式,因此空格/缩进很重要。另外,您能否确认文件的名称和位置?应该是这样的:

    .ebextensions/01-whenever.config

    files:
      "/opt/elasticbeanstalk/hooks/appdeploy/post/99_update_cron.sh"
        mode: "000755"
        owner: root
        group: root
        content: |
          #!/usr/bin/env bash
          . /opt/elasticbeanstalk/containerfiles/envvars
          su -c "cd $EB_CONFIG_APP_CURRENT; bundle exec whenever --update-cron" - $EB_CONFIG_APP_USER
    

    如果这不能解决问题,请检查以确保通过 eb ssh 连接来正确创建文件 /opt/elasticbeanstalk/hooks/appdeploy/post/99_update_cron.sh

    然后,检查/var/log/eb-activity.log 的日志文件并查找正在执行99_update_cron.sh 挂钩的部分。可能会有一些信息性错误消息。

    【讨论】:

    • 似乎正在与 Cron 交互,因为我现在正在获取日志文件 - 我可以问一个后续问题吗?我现在在日志中收到uninitialized constant Rails::Command::RunnerCommand::Trendi 错误 - 我在开发模式下没有 - 从哪里开始寻找这个的任何想法,这与我的 lib 任务没有绑定到 AWS 有关吗?我已将此添加到我的配置文件 config.autoload_paths << Rails.root.join('lib')
    • 嗯,该错误消息不会响起任何铃声。您可以从日志文件中发布整个相关部分吗?从[2018-01-09T19:50:20.461Z] INFO [4236] - [Application update app-x_xx-xxx-xxxxx-xxxxxx_xxxxxx@xxx/AppDeployStage1/AppDeployPostHook/99_update_cron.sh] : Starting activity...[2018-01-09T19:50:20.468Z] INFO [4236] - [Application update app-x_xx-xxx-xxxxx-xxxxxx_xxxxxx@xxx/AppDeployStage1/AppDeployPostHook/99_update_cron.sh] : Completed activity. 的所有内容?您也可以通过RAILS_ENV=production rails s 尝试在生产模式下本地运行。
    • 添加到原始问题 - 我还必须更改配置文件,因为您的上述答案不起作用:(将使用新配置文件更新问题
    • 注意 Trendi 是我尝试使用 cron 运行的任务的名称 - 位于我的 lib 目录中
    • 当你说my lib directory时,那是你项目的顶层吗?有一次我遇到了一个奇怪的问题,lib 下的文件没有在生产中加载。将文件移动到 app/lib 即可解决问题,无需添加任何 autoload_paths
    【解决方案2】:

    如果您有多个 EC2 实例正在运行并且只想在一个实例中运行时,您可能需要以下配置:

    files:
      "/tmp/99_update_cron.template":
        mode: "000755"
        owner: root
        group: root
        content: |
          #!/usr/bin/env bash
          # Using similar syntax as the appdeploy pre hooks that is managed by AWS
          set -xe
    
          EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
          EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
          EB_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
    
          . $EB_SUPPORT_DIR/envvars
          . $EB_SCRIPT_DIR/use-app-ruby.sh
    
          cd $EB_DEPLOY_DIR
          su -c "bundle exec whenever --update-cron"
          su -c "crontab -l"
    
    container_commands:
      enable_cron:
        command: "mv /tmp/99_update_cron.template /opt/elasticbeanstalk/hooks/appdeploy/post/99_update_cron.sh"
        leader_only: true
    

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 2017-09-01
      • 2019-04-21
      • 2014-12-22
      • 2018-06-12
      • 2015-04-03
      • 2015-03-20
      • 2015-07-28
      • 2016-01-04
      相关资源
      最近更新 更多