13

Amazon S3 バケットに接続して最新の本番バックアップをダウンロードする Ruby スクリプトがあります。私はスクリプトをテストしました (これは非常に単純です)。正常に動作します。

ただし、このスクリプトを cron ジョブとして実行するようにスケジュールすると、Amazon (aws-s3) gem をロードするときに失敗するようです。

私のスクリプトの最初の数行は次のようになります。

#!/usr/bin/env ruby
require 'aws/s3'

前述のとおり、このスクリプトを手動で実行すると、正常に動作します。スケジュールされた cron ジョブを介して実行すると、gem をロードしようとすると失敗します。

「require」: ロードするファイルがありません -- aws/s3 (LoadError)

このスクリプトの crontab は次のようになります。

0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1

当初は、cron が別のユーザーとして実行されているためではないかと考えていましたが、Ruby スクリプトの開始時に「whoami」を実行すると、いつも使用しているのと同じユーザーとして実行されていることがわかります。

また、バンドルの初期化を行い、宝石を宝石ファイルに追加しましたが、これは何の影響もないようです。

cron が gem のロードに失敗するのはなぜですか? 私はUbuntuを実行しています。

4

6 に答える 6

24

ここで述べたように、 https://coderwall.com/p/vhv8awを試すだけです

rvm cron setup # let RMV do your cron settings

このコマンドを実行する前に、必ず crontab のコピーを作成してください。

于 2014-03-29T20:25:24.770 に答える
12

手動で実行していて動作する場合は、おそらく cron が実行されているシェル環境とは異なる環境にいる可能性があります。あなたが Ubuntu を使用していると述べているので、cron ジョブはおそらく /bin/sh の下で実行され、手動で何も変更していない場合は、/bin/bash の下でそれらを実行します。

環境の問題をデバッグしたり、ジョブを実行するシェルを変更したりできます。

デバッグするには、cron ジョブが使用しているシェルを特定する方法がいくつかあります。で定義できます。

/etc/crontab

または、この SO 回答で言及されているように、cron ジョブを作成してシェルと環境情報をダンプすることもできます: cron がスクリプトを実行する環境をシミュレートする方法は?

そのシェルに切り替えて、ジョブが失敗する原因となっている実際のエラーを確認するには、次のようにします。

sudo su
env -i <path to shell> (e.g. /bin/sh)

次に、スクリプトを実行すると、エラーの内容が表示され、エラーを修正できるはずです (rubygems?)。

オプション 2 は、シェルを切り替えることです。あなたはいつでも次のようなことを試すことができます:

 0 3 * * * /bin/bash -c '~/Downloader/download.rb > ~/Downloader/output.log 2>&1'

あなたの仕事をbashに強制する。それはまた物事をクリアするかもしれません。

于 2012-11-20T14:53:46.603 に答える
5

Gem パスを明示的に設定することもできます。

GEM_HOME="/usr/local/rvm/gems/ruby-1.9.2-p290@my-special-gemset"

于 2012-11-19T23:53:12.907 に答える
1

非 cron 環境で実行しecho $PATH、コマンドの前にパスをコピーして crontab に貼り付けます。

echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

そしてcrontab内:

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin
0 3 * * * ~/Downloader/download.rb > ~/Downloader/output.log 2>&1
于 2012-11-19T21:34:05.957 に答える