まだ実行されていない場合にのみ rake タスクを実行することは何とか可能ですか?いくつかの rake タスクを実行するために cron を使用したいのですが、前の呼び出しが終了していない場合、rake タスクは開始されません ありがとう
5 に答える
私は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
また、ロックファイルを使用することもできますが、タスクで処理します。
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
これはおそらくある種のモジュールに抽出される可能性がありますが、あなたはその考えを理解します。
これに対する一般的な非 rake 固有の解決策は、pid ファイルをロックとして使用することです。rake タスクを、rake の実行時にこのファイルを作成し、rake の実行が終了したら削除し、開始前にチェックするスクリプトでラップします。
レーキに何かが組み込まれているかどうかはわかりません。私は何も知りません。
このレーキ タスクを単純にスキップしたい場合は、データベースを使用してタスクの進行状況に関する情報を保存し (たとえば、特定のタスクの開始時と終了時にフィールドを更新する)、各タスクを実行する前にその情報を確認することもできます。
ただし、キューのような動作が必要な場合は、タスクを処理するデーモンを作成することを検討してください。プロセスは非常にシンプルで、より多くの制御が可能です。これについては非常に優れた Railscast があります: Custom Daemon
デーモン アプローチは、レール環境が各タスクで再度読み込まれることも防ぎます。これは、rake タスクが頻繁に行われる場合に特に役立ちます。