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/ruby
em 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 cron
o 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 source
editado 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"