Carregar shell de login dentro do cronjob do usuário

Carregar shell de login dentro do cronjob do usuário

Estou tentando executar uma tarefa rake usando um cronjob agendado. Meu crontab é mais ou menos assim:

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

Ruby na minha conta é fornecido pelo RVM, que é carregado via ~/.bashrc(antes da verificação de não interação):

# 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

Repetidamente, esta tarefa falha na execução, pois o RVM não é carregado quando a tarefa é chamada ( /usr/bin/rubyem vez disso, usa o sistema) e as dependências da gema estão faltando.

Como posso fazer o crontab carregar meu ambiente shell antes de executar meus trabalhos agendados? obrigado.

Responder1

Simplesmente não forneceria seu ~/.bashrc no cronjob?

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

Responder2

usar o shell de login não é recomendado em processos em segundo plano.

você pode usar este método:

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

também existe rvm crono comando:

rvm help cron

Responder3

Depois de pesquisar um pouco após a resposta de @mpapis, parece que há uma página no site RVM queelabora como usar uma instalação RVM específica em um script executado pelo cron.

Basicamente, você descobre qual RVM gostaria de usar executando isto (usando Ruby 1.9.3 aqui):

$ rvm env --path -- 1.9.3-p125

Substitua sua versão Ruby específica. Isso apontará para o arquivo que precisa ser sourceeditado para que o ambiente Ruby desejado seja carregado.

Escreva o script a ser executado pelo seu cron job:

meutrabalho.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

Certifique-se de tornar o arquivo executável:

chmod u+x myjob.sh

crontab

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



BAM! Feito.

informação relacionada