1

CentOS 5.6サーバーでいつでも0.7.3、Rails 3.2.2、Ruby 1.9.3、Passenger 3.0.11を使用します(私はrvmを使用していません)。問題は、いつでも作成されたcronジョブが明確に実行され、Cronログで確認できることですが、実際にはRailsコードを実行していません。cronコードをコピーしてターミナルに貼り付けると、期待どおりに機能します。

実行するコード:

class SomeModel < ActiveRecord::Base

  #Delete all items that haven't been updated for 2 hours or more
  def self.cron_job
    SomeModel.destroy_all(updated_at < ?", 2.hours.ago])
  end
end

schedule.rb:

set :output, "/var/log/cron"

every 1.day, :at => '4:45 am' do
  runner "SomeModel.cron_job"
end

次のcronを生成しました(出力crontab -l):

# Begin Whenever generated tasks for: site_name
45 4 * * * /bin/bash -l -c 'cd /home/user/domains/site_name && script/rails runner -e production '\''SomeModel.cron_job'\'' >> /var/log/cron 2>&1'
# End Whenever generated tasks for: site_name

翌朝チェックすると、cronログでこれを見つけます。

Apr 14 04:45:01 node1 crond[9155]: (root) CMD (/bin/bash -l -c 'cd /home/user/domains/site_name && script/rails runner -e production '\''SomeModel.cron_job'\'' >> /var/log/cron 2>&1')

ただし、削除されるべきであったアイテムはまだデータベースにあります。cronが実行するはずのコードをコピーして(/ bin / bash -l -c'cd ... 2>&1')、ターミナルから実行すると、期待どおりにアイテムが削除されます。

また、ターミナルから手動でコードを実行してもエラーはありません。cronログに次のように表示されます。

from script/rails:5:in 'require'
from script/rails:5
from script/rails:5:in 'require'
from script/rails:5

複数のcronジョブが実行された時点で、この「エラー(?)」はログに1回だけ出力されます。

cronジョブから何かを実行することと、ターミナルにコードを入力することには違いがありますか?なぜ違いがあり、それがcronjobからも機能することを確認するにはどうすればよいですか?また、ログ出力はエラーであると想定されていますが、残念ながらあまりわかりません。

4

3 に答える 3

1

さて、今それを解決しました。問題は、Ruby が /usr/bin にあり、Ruby が /usr/local/bin にあるということでした。

/usr/bin の ruby​​ を削除し、正しいパス変数 (PATH="/usr/local/bin:/usr/bin:/bin") を crontab に追加しました。すべてが期待どおりに機能しています。

于 2012-04-16T15:08:24.820 に答える
1

環境を適切に設定していない可能性があります。開発環境にいる場合:

whenever --set environment=development

環境を開発に設定します

于 2012-04-14T06:08:59.867 に答える
0

将来の Google 社員向け: 私はこれとまったく同じ問題を抱えていましたが、私の解決方法は非常に異なっていました...

set :output,'./cronOutput.txt'ファイルに入力して出力をログに記録し、出力エラーとしてschedule.rb取得し続けました。No JavaScript runtine foundそこで、execjstherubyracerのgem をインストールしました。その後すぐにすべてが機能し始めました。

私のプロジェクトはまだ開発中だったので、Steve のアドバイスに (ある程度) 従い、テーブルにクエリを実行するためにset :environment, "development"自分のプロジェクトにも含める必要がありました。schedule.rb

これが他の誰かに役立つことを願っています!

于 2012-07-31T15:48:53.123 に答える