Необходимо настроить среду rvm перед каждым заданием cron - PullRequest
8 голосов
/ 15 апреля 2011

Я установил и настроил RVM примерно в соответствии с шаблоном, описанным в первой части этого набора инструкций: http://blog.ninjahideout.com/posts/a-guide-to-a-nginx-passenger-and-rvm-server

По сути, это означает, что нет системного ruby ​​перед сборкой (все установки ruby ​​управляются RVM), а RVM устанавливается в масштабе всей системы, а не присоединяется к определенному пользователю (файлы в /usr/local/rvm), поэтому все пользователи в rvm группа может получить доступ к тем же рубинам с теми же самыми установленными драгоценными камнями.

Одна из проблем с настройкой системы таким образом заключается в том, что среда rvm должна быть настроена в сеансе оболочки, прежде чем можно будет использовать ruby. Для всех пользователей rvm я поместил это в их .bashrc : source "/usr/local/rvm/scripts/rvm". Это прекрасно работает для сессий SSH.

Проблема возникает для заданий cron, которые не выполняются .bashrc . Приведенный выше скрипт rvm (/ usr / local / rvm / scripts / rvm) значительно сложнее, чем настройка нескольких переменных среды, поэтому мне бы хотелось запускать эту команду перед каждым заданием в файле.

Конечно, я мог бы сделать это вручную, вот так:

1 2 * * * source "/usr/local/rvm/scripts/rvm"; /do/some/cron/job/1
3 4 * * * source "/usr/local/rvm/scripts/rvm"; /do/some/cron/job/2
5 6 * * * source "/usr/local/rvm/scripts/rvm"; /do/some/cron/job/3
7 8 * * * source "/usr/local/rvm/scripts/rvm"; /do/some/cron/job/4

Но я бы предпочел сделать что-то вроде этого:

[execute] source "/usr/local/rvm/scripts/rvm"

1 2 * * * /do/some/cron/job/1
3 4 * * * /do/some/cron/job/2
5 6 * * * /do/some/cron/job/3
7 8 * * * /do/some/cron/job/4

Очевидно, приведенный выше синтаксис не работает. Но есть ли способ заставить это работать? Страницы man cron и документация здесь не сильно помогли. Но есть ли какой-то трюк или стандартный способ добиться этого?

Если это имеет значение, я использую Ubuntu 10.10 (Maverick Meerkat).

Ответы [ 4 ]

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

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

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

#!/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'

Полный пост в блоге по теме

15 голосов
/ 12 марта 2015

Просто сделай rvm cron setup

Это давайте установим rvm настройки ruby ​​cron

Тогда crontab -e

Добавь свои задачи cron, сохрани и закрой, и все готово!

4 голосов
/ 15 апреля 2011

Файлы Crontab обычно допускают только два типа вещей (плюс комментарии и пустые строки, если вы хотите быть педантичными):

  1. Настройка переменной среды.
  2. Спецификации команд.

И некоторые crontabs даже не поддерживают установку переменных окружения (хотя я сомневаюсь, что вы натолкнетесь на такую ​​практику).

Если вам нужно сделать больше, чем просто установить некоторые переменные окружения, тогда вам нужно будет указать source "/usr/local/rvm/scripts/rvm" либо в спецификациях cron, как вы задали в своем вопросе, либо вам нужно будет обернуть свои задания cron в cron runnerкак-то так:

#!/bin/sh
source "/usr/local/rvm/scripts/rvm"
exec $1

А потом в crontab:

1 2 * * * /path/rvm_cron_runner /do/some/cron/job/1

Шесть из одного, полдюжины из другого.

1 голос
/ 16 октября 2012

Если ваш cronjob представляет собой обычный файл ruby, то docs говорят, что вы можете просто использовать встроенную оболочку, которая загрузит правильную версию ruby ​​и набор гемов:

1 0  * * * /usr/local/rvm/bin/ruby-1.9.2-p290@projectX /path/to/script.rb

Однако вам все равно нужно добавить этот вызов в каждую строку.

...