【问题标题】:Setting env variable to a cron scheduled task using whenever gem使用每当 gem 将 env 变量设置为 cron 计划任务
【发布时间】:2016-05-26 08:30:25
【问题描述】:
在下面的代码中,我想设置一些存储在文件中的环境变量。我错过了什么吗?在“bundle execwhen”之后在生产中打印 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
【问题讨论】:
标签:
ruby
cron
rake-task
whenever
【解决方案1】:
-
system 不是任何时候的工作类型。它是Kernel.system,它在每次运行命令时执行传递给它的字符串,而不是将该字符串转换为 cron 语法。看起来你真正的意思是:
command "for line in `cat config/myEnvFile.env` ; do export $line ; done"
# Note: command instead of system
command 是由 here 定义的内置作业类型。
-
every-block 中的每一行代码都作为它自己的命令运行。如果你运行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 问题:
首先,这两个命令彼此无关——它们作为两个完全独立的进程运行。
第一个运行在 cron 的默认目录中,这可能不是 config/myEnvFile.env 所在的位置。
要解决此问题,您需要将所有内容合并到一个命令中。通过使用任何时候的 rake 作业类型,您将最终进入正确的目录,但您仍然以某种方式导出所有这些变量。
一种方法是重命名文件.ruby-env 并使用rvm。 rvm除了为你管理ruby版本外,还会在你进入目录时自动加载.ruby-env中定义的所有环境变量。
如果 RVM 不适合您,或者您想要更轻量级的东西,请将文件重命名为 .env 并使用 dotenv。他们的 README 文档准确地记录了如何通过或 without Rails 使用 gem。没有 Rails,就这么简单: