Пожалуйста, не используйте ключ -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'
Полный блог на эту тему