Загрузите оболочку входа внутри пользователя cronjob

4091
sa125

Я пытаюсь запустить грабли, используя запланированный cronjob. Мой crontab выглядит примерно так:

0 1 * * 1-7 /bin/bash -l -c "cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log" 

Ruby на моем аккаунте предоставляется RVM, который загружается через ~/.bashrc(до проверки отсутствия взаимодействия):

# load RVM env [[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm  # If not running interactively, don't do anything [ -z "$PS1" ] && return  # ... rest of logic 

Снова и снова, эта задача не запускается, поскольку RVM не загружается при вызове задачи ( /usr/bin/rubyвместо нее используются системные ), а зависимости от гемов отсутствуют.

Как сделать так, чтобы crontab загружал мою среду оболочки перед выполнением запланированных заданий? Благодарю.

0

3 ответа на вопрос

2
mpapis

использование фоновой оболочки не рекомендуется в фоновых процессах.

Вы можете использовать этот метод:

0 1 * * 1-7 ~/.rvm/bin/rvm in ~/jobs/rake do rake reports:create >> ~/jobs/logs/cron.log" 

также есть rvm cronкоманда:

rvm help cron 
1
terdon

Wouldn't simply sourcing your ~/.bashrc in the cronjob work?

0 1 * * 1-7 /bin/bash -l -c "source ~/.bashrc; cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log" 
Я тоже так думал, но это не сработало. sa125 12 лет назад 0
@ sa125 Может ли это быть из-за строки `[-z" $ PS1 "] && return`? Я почти уверен, что cronjobs не работают в интерактивной оболочке. В качестве альтернативы, не могли бы вы поместить `[[-s $ HOME / .rvm / scripts / rvm]] && source $ HOME / .rvm / scripts / rvm` в строку cron? terdon 12 лет назад 0
Первое - я ценю вашу помощь. Я попытался переместить строку [[-s $ HOME / .rvm / scripts / rvm]] && source $ HOME / .rvm / scripts / rvm` в собственный файл `~ / .loadrvm`. Затем я изменил строку crontab на `0 1 * * 1-7 / bin / bash -l -c" source ~ / .loadrvm && echo \ `which ruby ​​\` >> ~ / cron.log "`. Я все еще получаю `/ usr / bin / ruby`. sa125 12 лет назад 0
@ sa125 Может ли это быть потому, что вы запускаете bash как оболочку входа (-l) вместо интерактивной оболочки? terdon 12 лет назад 0
1
sa125

After a little digging following the response from @mpapis, it seems there's a page on the RVM site which elaborates how to use a specific RVM install in a script executed by cron.

Basically you find out which RVM you'd like to use by running this (using ruby 1.9.3 here):

$ rvm env --path -- 1.9.3-p125 

Substitute your specific ruby version. This will point to the file that needs to be sourceed so that your desired ruby environment is loaded.

Write the script to be run by your cron job:

myjob.sh

#!/bin/bash # the full path to the RVM env you got from running `rvm env ...` source ~/.rvm/environments/ruby-1.9.3-p125 # do stuff ... cd ~/jobs/rake rake reports:create 

Make sure you make the file executable:

chmod u+x myjob.sh 

crontab

0 1 * * 1-7 bash -c "cd ~/jobs && ./myjob.sh" 



BAM! Done.

Похожие вопросы