Cron Job Rails 3 - загрузка системы ruby, а не RVM ruby - PullRequest
0 голосов
/ 23 мая 2011

Я пытаюсь настроить задание cron с помощью следующей команды:

crontab -l


Begin Whenever generated tasks for: myapp
* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(MyModel)"'

Я получаю следующую ошибку;в котором я вижу его загрузку Ruby 1.8.Проблема в том, что я использую RVM с ruby ​​1.9.2.Как мне указать правильный путь RVM в CRON?

Subject: Cron <boris@jz> /bin/bash -l -c cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(Place)"
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=boris>
X-Cron-Env: <USER=boris>
X-Cron-Env: <HOME=/Users/boris>
Message-Id: <20110523022400.A5B242C608D@jz.local>
Date: Sun, 22 May 2011 19:24:00 -0700 (PDT)

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- bundler/setup (LoadError)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require'
from /Users/boris/projects/myapp/config/boot.rb:6
from script/rails:5:in `require'
from script/rails:5

Как мне указать правильный путь RVM в CRON?

Заранее спасибо

Путь Ruby, с которымРубин:

/Users/boris/.rvm/rubies/ruby-1.9.2-p180/bin/ruby

Ответы [ 3 ]

3 голосов
/ 17 октября 2011

Пожалуйста, не используйте ключ -l в заданиях cron. Ключ --login указывает bash работать в качестве оболочки для входа. Таким образом, он будет загружать вашу среду, и может показаться, что все работает. Однако задания cron по своей природе являются неинтерактивными, не входящими в систему оболочками. Вызывать их так, как если бы они были, просто плохая практика. Кроме того, когда bash запускает оболочку входа в систему, она сначала загружает системную среду (/ etc / profile), и если в этом файле что-то нужно распечатать на экран (например, motd), ваша задача cron сообщит о неприятных ошибках, таких как:

stty: TIOCGETD: неподходящий ioctl для устройства

Вам также не нужно писать cron runner (следуя этой логике, вы могли бы также написать cron runner). Пожалуйста, будьте проще. Все, что вам нужно сделать, это настроить вашу задачу cron для запуска оболочки bash и заставить эту оболочку bash загружать вашу среду.

Строка shebang в вашем скрипте должна относиться не напрямую к исполняемому файлу ruby, а к ruv rvm:

#!/usr/bin/env ruby

Это дает указание сценарию загружать среду и запускать ruby, как в командной строке с загруженным rvm.

Во многих системах, производных от UNIX, crontabs может иметь раздел конфигурации перед фактическими строками, которые определяют задания, которые должны быть запущены. Если это так, вы должны указать:

SHELL=/path/to/bash  

Это гарантирует, что задание cron будет порождено из bash. Тем не менее, ваша среда отсутствует, поэтому, чтобы дать команду bash загрузить вашу среду, вам нужно добавить в раздел конфигурации следующее:

BASH_ENV=/path/to/environment (typically .bash_profile or .bashrc) 

HOME автоматически выводится из строки / etc / passwd владельца crontab, но вы можете переопределить ее.

HOME=/path/to/home

После этого задание cron может выглядеть так:

15 14 1 * *     $HOME/rvm_script.rb

Что если ваш crontab не поддерживает раздел конфигурации. Что ж, вам придется указывать все директивы по окружающей среде в одной строке вместе с самой работой. Например,

15 14 1 * * export BASH_ENV=/path/to/environment && /full/path/to/bash -c '/full/path/to/rvm_script.rb'

Полный блог на эту тему

1 голос
/ 23 мая 2011

Ваша проблема в том, что вы выполняете две команды, но не так, как вы ожидаете.Эти две команды:

  1. /bin/bash -l -c cd /Users/boris/projects/myapp
  2. script/rails runner "Resque.enqueue(MyModel)"

Если вторая выполняется только в случае успеха первой.Я думаю, что вам просто нужны некоторые кавычки:

* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && script/rails runner "Resque.enqueue(MyModel)"'

Эти одинарные кавычки будут подавать вашу пару cd ... && script/rails ... в /bin/bash как одну команду, и это должно изменить текущий рабочий каталог на тот, который вы хотите, когда script/rails выполнено.

0 голосов
/ 23 мая 2011

Самое простое решение - использовать эту команду вместо:

Begin Whenever generated tasks for: myapp
* * * * * /bin/bash -l -c 'cd /Users/boris/projects/myapp && ./script/rails runner "Resque.enqueue(MyModel)"'
...