使用when gem时将env变量设置为cron计划任务

时间:2016-02-15 12:18:46

标签: ruby cron rake-task whenever

在下面的代码中,我想设置一些存储在文件中的环境变量。我错过了什么吗?在'bundle exec when'之后在生产中打印env没有显示设置的环境变量。每当gem用于预定的cron任务并花费数小时来计算这个。也可以建议任何其他方式。

every 1.day, :at => '2:30 am' do
  # Run shell script to assign variables and continue the rake task
  system "for line in `cat config/myEnvFile.env` ; do export $line ; done"
  rake "task:continue_doing_my_task"
end

1 个答案:

答案 0 :(得分:1)

  1. system不是每当工作类型。它是Kernel.system,执行when命令运行时传递给它的String,而不是将该String转换为cron语法。看起来你真正的意思是:

    command "for line in `cat config/myEnvFile.env` ; do export $line ; done"
    # Note: command instead of system
    

    command是由here随时定义的内置作业类型。

  2. every - 块内的每行代码都按照自己的命令运行。如果你运行whenever(没有任何参数,所以它只显示 放在crontab中的内容而不实际修改crontab,并且在我上面描述的修正后),你会看到输出是这样的:

    30 2 * * * * /bin/bash -l -c 'for line in `cat config/myEnvFile.env` ; do export $line ; done'
    30 2 * * * * /bin/bash -l -c 'cd /path/to/project && RAILS_ENV=production bundle exec rake task:continue_doing_my_task --silent > my_log_file.log 2&>1'
    

    注意2个问题:

    1. 首先,这两个命令彼此无关 - 它们作为两个完全独立的进程运行。

    2. 第一个是在cron的默认目录中运行,该目录可能是不是,其中config / myEnvFile.env位于此处。

    3. 要解决此问题,您需要将所有内容合并到一个命令中。通过使用每当rake作业类型,您结束在正确的目录中,但您仍然以某种方式导出所有这些变量。

      执行此操作的一种方法是重命名文件.ruby-env并使用rvm。 rvm,除了为您管理ruby版本外,还会在您输入目录时自动加载.ruby-env中定义的所有环境变量。

      如果RVM不是您的选项,或者您想要更轻量级的内容,请重命名文件.env并使用dotenv。他们的自述文件准确记录了如何使用gem或without Rails。没有Rails,就这么简单:

      • 将dotenv添加到您的Gemfile
      • 对您的Rakefile进行此更改:

        require 'dotenv/tasks' # 1. require this file
        namespace :task
          task continue_doing_my_task: :dotenv do # 2. make :dotenv a prerequisite for your task