使用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
-
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
是一个内置的作业类型,只要在这里定义。 -
每个块内的
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个问题:
-
首先,这两个命令彼此无关 – 它们作为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
-