2016-02-15 1 views
1

В моем коде ниже я хотел установить несколько переменных среды, хранящихся в файле. Я что-то упускаю? Печать env в процессе производства после `bundle exec when 'не показывает установленные переменные среды. Использование всякого драгоценного камня для запланированной задачи cron и часовых вычислений. Можно предложить и любой другой способ.Настройка переменной env для задачи планирования cron, использующей каждый раз, когда gem

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
  1. system не всякий раз, когда тип задания. Это Kernel.system, который выполняет переданную ему строку, когда выполняется всякая команда, вместо преобразования этого синтаксиса String в cron. Похоже, что вы на самом деле имеете в виду:

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

    command является встроенным типом задания определяется когда это here.

  2. Каждая строка кода внутри 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 вопроса:

    1. Во-первых, эти 2 команды не имеют ничего общего друг с другом - они работают как 2 совершенно разных процессов.

    2. Первый работает в каталоге по умолчанию cron, который, вероятно, не, где находится config/myEnvFile.env.

    Чтобы исправить это, вам необходимо объединить все в одну команду. При использовании всякого типа rake у вас будет в конечном каталоге, но вы все равно должны экспортировать все эти переменные.

    Один из способов сделать это - переименовать файл .ruby-env и использовать rvm. rvm, помимо управления версиями ruby ​​для вас, автоматически загрузит все переменные среды, определенные в .ruby-env, когда вы входите в каталог.

    Если RVM не является для вас вариантом, или вы хотите что-то более легкое, переименуйте файл .env и используйте dotenv. Их README документы точно, как использовать драгоценный камень, с или 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