Laden Sie die Login-Shell in den Benutzer cronjob

4158
sa125

Ich versuche, eine Rake-Aufgabe mit einem geplanten Cronjob auszuführen. Mein Crontab sieht ungefähr so ​​aus:

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

Ruby auf meinem Konto wird von RVM bereitgestellt, das über ~/.bashrc(vor der Prüfung ohne Interaktion) geladen wird :

# 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 

Diese Task wird immer wieder nicht ausgeführt, da RVM beim Aufruf der Task nicht geladen wird (verwendet /usr/bin/rubystattdessen das System ) und es fehlen Abhängigkeiten von Gems.

Wie kann ich meine Shell-Umgebung vor dem Ausführen meiner geplanten Jobs mit Crontab laden? Vielen Dank.

0

3 Antworten auf die Frage

2
mpapis

Die Verwendung der Login-Shell wird in Hintergrundprozessen nicht empfohlen.

Sie können diese Methode verwenden:

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

auch gibt es das rvm cronKommando:

rvm help cron 
1
terdon

Würden Sie Ihre ~ / .bashrc nicht einfach in die Cronjob-Arbeit aufnehmen?

0 1 * * 1-7 /bin/bash -l -c "source ~/.bashrc; cd ~/jobs/rake && rake reports:create >> ~/jobs/logs/cron.log" 
Das dachte ich auch, aber das hat nicht funktioniert. sa125 vor 11 Jahren 0
@ sa125 Könnte das an der Zeile "[-z" $ PS1 "] && return liegen? Ich bin mir ziemlich sicher, dass Cronjobs nicht in einer interaktiven Shell laufen. Könnten Sie nicht auch `[[-s $ HOME / .rvm / scripts / rvm]] && source $ HOME / .rvm / scripts / rvm` in die cron-Zeile einfügen? terdon vor 11 Jahren 0
Erstens - ich freue mich über Ihre Hilfe. Ich habe versucht, die Zeile [[-s $ HOME / .rvm / scripts / rvm]] && source $ HOME / .rvm / scripts / rvm in die eigene Datei `~ / .loadrvm` zu verschieben. Ich änderte dann die Crontab-Zeile in '0 1 * * 1-7 / bin / bash -l -c "source ~ / .loadrvm && echo \" welches Rubin \ `>> ~ / cron.log" `. Ich bekomme immer noch `/ usr / bin / ruby`. sa125 vor 11 Jahren 0
@ sa125 Könnte das sein, weil Sie bash als Login-Shell (-l) anstelle einer interaktiven Shell starten? terdon vor 11 Jahren 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.