Cronでrbenvを使用してRubyスクリプトを実行しようとしています。正しいRubyバージョンをロードするには、rbenvをロードする必要があることを知っています。
私はこのようなオプションを試しました:
*/10 * * * */bin/bash -c'source $ HOME/.bashrc; cd/data/app; Ruby -v '>> /tmp/logfile.txt 2>&1
しかし、セッションはインタラクティブではないため、正しいRubyバージョンがありません。次のような例を見つけました:
15 14 1 * * export BASH_ENV =/path/to/environment &&/full/path/to/bash -c '/ full/path/to/rvm_script.rb'
それはもっとうまくいきませんでした。次に、現在のシェルにrbenvのみをロードするローダーを作成しましたが、機能しません。
*/1 * * * */bin/bash -c '$ HOME/.rbenv/loader.sh; cd/data/app /; Ruby -v '>> /tmp/logfile.txt 2>&1
今、私はそれをロードする別の方法を探しています...何かアイデアはありますか?
Rbenvをロードするための解決策を見つけました。ローダーがrbenvをPATHにインポートする場合:
*/1 * * * */bin/bash -c '。 $ HOME/.rbenv/loader.sh; cd/data/app /; Ruby -v '
'。' '$ HOME/.rbenv/loader.sh'が重要になる前に、現在のシェルでスクリプトを実行します
またはローダーなしで、どちらが良いですか:
*/1 * * * */bin/bash -c'export PATH = "$ HOME/.rbenv/bin:$ PATH"; eval "$(rbenv init-)"; cd/data/app /; Ruby -v '
より良い解決策は、単にコマンドbash -lc
コマンドを使用することです。これにより、rbenvをセットアップするbashプロファイルファイルが読み取られます。 bash
のマニュアルページから:
-lbashをログインシェルとして呼び出されたかのように動作させます
Bashが対話型ログインシェルとして、または--loginオプションを指定した非対話型シェルとして呼び出されると、最初にファイル/ etc/profile(ファイルが存在する場合)からコマンドを読み取って実行します。そのファイルを読み取った後、〜/ .bash_profile、〜/ .bash_login、〜/ .profileの順に検索し、最初に存在して読み取り可能なコマンドからコマンドを読み取って実行します。 --noprofileオプションは、シェルの起動時にこの動作を禁止するために使用できます。
Kmmndrの答えは正しいですが、私はbash -l
-アプローチも気に入っています。
非対話型ログインシェルを開くと、作業が簡単になります。私のRailsアプリケーションとRubyスクリプトはすべて同じユーザーで実行されるため、オーバーヘッドは問題になりません。
だから代わりに
*/1 * * * * /bin/bash -c 'export PATH="$HOME/.rbenv/bin:$PATH" ; eval "$(rbenv init -)"; cd /data/app/; Ruby -v'
私がやります
*/1 * * * * /bin/bash -lc 'cd /data/app/; Ruby -v'
上記の回答に記載されているように、bash -l
は通常のログインのように機能します。つまり、rbenv環境はすでにセットアップされています(.bashrc
、.bash_profile
の/etc/profile.d/*
に適切な行がある場合)。
詳細が必要な場合は、このトピックについて ブログ投稿 と書きました。
Rubyのバックアップスクリプトでは、単に~/.rbenv/bin/rbenv exec Ruby [options] /path/to/Ruby/script.rb
を使用します。これを試してください:
* * * * * ~/.rbenv/bin/rbenv exec Ruby -v > ~/rbenv-Ruby-version.txt
@Kelvinからのこの回答は私のために働いた:
*/1 * * * * PATH=$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH Ruby -v >> ~/test.out