Tag: bash

RVM w skryptach powłoki Bash (jak używać)

Załóżmy, że potrzebujemy napisać skrypt który odpala nam kod w Rubym. Kod ten działa jednak tylko pod specyficzną wersją Rubiego (lub nie działa pod 1.9.2, itd). Jeśli chcielibyśmy zrobić to tak:

rvm system
ruby /~/nasz_program.rb

okaże się, że skrypt się nie odpali (tzn odpali ale pod niepoprawną wersją Rubinka).
Spróbujmy zatem tak:

rvm system
ruby -v

U mnie - domyślną wersją jest wersja 1.9.2-p0, zaś systemowa to 1.8.7. Wywołanie takiego skryptu nie zmieni nam jednak wersji Rubiego na wersję systemową. Aby móc zmieniać dynamicznie wersje Rubiego serwowaną przez RVM musimy dodać do naszego skryptu taki oto kod:

if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
  source "$HOME/.rvm/scripts/rvm"
elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
  source "/usr/local/rvm/scripts/rvm"
else
  printf "ERROR: An RVM installation was not found.\n"
fi

dzięki temu, będziemy mogli sobie dynamicznie zmieniać Rubiego z jakiego korzystamy wewnątrz skryptu.

Uruchamianie zadań Rake z poziomu innych katalogów (nie z katalogu projektu)

Czasem potrzebujemy uruchomić zadanie Rake'owe niezależnie od katalogu w którym się znajdujemy. Powodem tego może być np potrzeba wrzucenia rake'owego taska do Crona, żeby odpalał się np. co 5 minut. Jak tego dokonać?

Pierwszą rzeczą jest dowiedzenie się gdzie leży Rake:

# Komenda:
which rake
# Wynik:
/usr/local/bin/rake

Jeśli z jakiegoś powodu nie mamy uprawnień do używania which, po prostu musimy strzelać. Jest duża szansa że rake będzie dokładnie tam, gdzie w powyższym przykładzie (chyba że korzystamy z RVM i nie jest to wersja --system).

Mając już rake'a, możemy przystąpić do działania. Załóżmy że chcemy odpalać go co 5 minut. W tym celu definiujemy następującą regułę:

*/5 * * * * env -i KOD_DO_ODPALENIA

Zagwarantuje nam to, że deamon systemowy, uruchomi nasz KOD_DO_ODPALENIA, co 5 minut. Następnie musimy dopisać kod który mamy uruchomić. Aby to zrobić, musimy powiązać przejście do katalogu aplikacji z odpaleniem jej. Robimy to operatorem &&. Najpierw mówimy deamonowi gdzie chcemy być:

cd /home/nazwa_konta/rails/apka/

następnie co chcemy uruchomić i w jakim środowisku:

/usr/local/bin/rake cron:all  RAILS_ENV=production

i łączymy to w jedną regułę:

*/5 * * * * env -i cd /home/nazwa_konta/rails/apka/ &&  /usr/local/bin/rake cron:all  RAILS_ENV=production

jeśli tamto nie zadziała, można w ten sposób:

*/5 * * * * env -i bash -c 'cd /home/nazwa_konta/rails/apka/; /usr/local/bin/rake cron:all RAILS_ENV=production'

Wersja dla Crona który nie ma tych samych zmiennych środowiskowych co shell:

 */5 * * * * source $HOME/.serv && cd /home/nazwa_konta/rails/apka && rake cron:all RAILS_ENV=production

Copyright © 2025 Closer to Code

Theme by Anders NorenUp ↑