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

在下面的代码中,我想设置一些存储在文件中的环境变量。 我错过了什么吗? 在’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. 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是一个内置的作业类型,只要在这里定义。

  2. 每个块内的every行代码every按照自己的命令运行。 如果你随时运行(没有任何参数,所以它只是显示它将放在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个完全独立的进程运行。

    2. 第一个是在cron的默认目录中运行,这可能不是 config / myEnvFile.env所在的位置。

    要解决此问题,您需要将所有内容合并到一个命令中。 通过使用随时随地的rake作业类型,您最终进入正确的目录,但仍然以某种方式导出所有这些变量。

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

    如果RVM不是您的选项,或者您想要更轻量级的东西,请重命名文件.env并使用dotenv 。 他们的README文档准确地说明了如何使用gem,有或没有 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