9

まだ実行されていない場合にのみ rake タスクを実行することは何とか可能ですか?いくつかの rake タスクを実行するために cron を使用したいのですが、前の呼び出しが終了していない場合、rake タスクは開始されません ありがとう

4

5 に答える 5

13

私はlockrunを使用して、cron タスクが複数回実行されるのを防ぎます (これは、同じ呼び出しでコマンドを呼び出す場合にのみ機能lockrunするため、さまざまな呼び出しパスから保護する必要がある場合は、他の方法を探す必要があります)。

crontab では、次のように呼び出します。

*/5 * * * * /usr/local/bin/lockrun --lockfile=/var/run/this_task.lockrun -- cd /my/path && RAILS_ENV=production bundle exec rake this:task
于 2011-09-14T02:36:12.500 に答える
10

また、ロックファイルを使用することもできますが、タスクで処理します。

def lockfile
  # Assuming you're running Rails
  Rails.root.join('tmp', 'pids', 'leads_task.lock')
end

def running!
  `touch #{lockfile}`
end

def done!
  `rm #{lockfile}`
end

def running?
  File.exists?(lockfile)
end

task :long_running do
  unless running?
    running!
    # long running stuff
    done!
  end
end

これはおそらくある種のモジュールに抽出される可能性がありますが、あなたはその考えを理解します。

于 2011-10-21T15:25:06.370 に答える
5

これに対する一般的な非 rake 固有の解決策は、pid ファイルをロックとして使用することです。rake タスクを、rake の実行時にこのファイルを作成し、rake の実行が終了したら削除し、開始前にチェックするスクリプトでラップします。

レーキに何かが組み込まれているかどうかはわかりません。私は何も知りません。

于 2011-09-06T14:02:23.883 に答える
2

このレーキ タスクを単純にスキップしたい場合は、データベースを使用してタスクの進行状況に関する情報を保存し (たとえば、特定のタスクの開始時と終了時にフィールドを更新する)、各タスクを実行する前にその情報を確認することもできます。

ただし、キューのような動作が必要な場合は、タスクを処理するデーモンを作成することを検討してください。プロセスは非常にシンプルで、より多くの制御が可能です。これについては非常に優れた Railscast があります: Custom Daemon

デーモン アプローチは、レール環境が各タスクで再度読み込まれることも防ぎます。これは、rake タスクが頻繁に行われる場合に特に役立ちます。

于 2011-09-13T02:33:59.273 に答える