是否有可能以某種方式執行rake任務,只有當它沒有運行時 我想用cron來執行一些rake任務,但是如果以前的調用沒有完成,rake任務不應該啓動 謝謝rake檢查是否已經運行
6
A
回答
12
我用lockrun防止後臺任務運行多次(通過相同lockrun
調用調用命令的時候,所以如果你需要從不同的調用路徑保護,那麼你就需要尋找其他的方法,這僅適用於)。
在crontab,您可以調用它像這樣:
*/5 * * * * /usr/local/bin/lockrun --lockfile=/tmp/this_task.lockrun -- cd /my/path && RAILS_ENV=production bundle exec rake this:task
5
2
如果您只是想跳過這個rake任務,您還可以使用數據庫存儲有關任務進度的信息(例如,在開始和完成給定任務時更新字段),並在運行每個任務之前檢查該信息。然而,如果你想要一個類似隊列的行爲,你可能需要考慮創建一個守護進程來處理這些任務。這個過程非常簡單,給你更多的控制。這裏有一個非常好的railscast:Custom Daemon
守護進程方法也將阻止再次在每個任務上加載rails環境。如果你的rake任務頻繁,這特別有用。
6
此外,您還可以使用一個鎖文件,但在任務處理:
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
這大概可以提取到一些一種模塊,但你明白了。
1
這裏是我的變體與文件鎖軌Rake任務。
在耙任務文件將這個(在命名空間,所以它不會與其他rake任務重疊):
def cron_lock(name)
path = Rails.root.join('tmp', 'cron', "#{name}.lock")
mkdir_p path.dirname unless path.dirname.directory?
file = path.open('w')
return if file.flock(File::LOCK_EX | File::LOCK_NB) == false
yield
end
用法:
cron_lock 'namespace_task_name' do
# your code
end
完整的例子:
namespace :service do
def cron_lock(name)
path = Rails.root.join('tmp', 'cron', "#{name}.lock")
mkdir_p path.dirname unless path.dirname.directory?
file = path.open('w')
return if file.flock(File::LOCK_EX | File::LOCK_NB) == false
yield
end
desc 'description'
task cleaning: :environment do
cron_lock 'service_cleaning' do
# your code
end
end
end
相關問題
- 1. 檢查magento是否已經運行cronjob
- 2. 檢查cronjob是否已經運行
- 3. 檢查應用程序是否已經運行
- 4. Linux互斥鎖檢查程序是否已經在運行?
- 5. 如何檢查CABasicAnimation是否已經應用並運行?
- 6. 檢查'onload'是否已經被觸發?
- 7. 檢查文件是否已經打開
- 8. 檢查GLUT是否已經初始化?
- 9. 檢查數據是否已經存在
- 10. 檢查用戶是否已經登錄?
- 11. 檢查表單是否已經存在
- 12. Rails,檢查url是否已經存在
- 13. 檢查jQuery「Fancybox」是否已經註冊?
- 14. 檢查tomcat是否運行?
- 15. PHP:我該如何檢查一下php腳本是否已經運行?
- 16. 如何檢查rufus-scheduler是否已經在運行我的Rails應用程序
- 17. 檢查一個特定的Python腳本是否已經在運行
- 18. 我有什麼選擇來檢查IntentService是否已經在運行?
- 19. PHP檢查表單是否已經使用num行提交
- 20. 檢查SQLite表中是否已經存在具有值的行
- 21. Android如何檢查FrameLayout已經查看是否添加
- 22. 無法運行rake db:schema:load除非數據庫已經被加載
- 23. 如何檢查dispatch_async塊是否已完成運行
- 24. C++如何檢查Outlook進程是否已在運行
- 25. 檢查Steam是否正在運行並且用戶已登錄
- 26. 如何檢查php-fpm是否已安裝並正確運行?
- 27. iOS Spritekit - 如何檢查音樂是否已在運行?
- 28. 如何檢查WPF應用程序是否已在運行?
- 29. C++ *運算符是否「已經超載?」
- 30. 檢查PDO查詢是否已經獲取匹配條件的所有行
謝謝你的答案從來沒有聽說過關於lockrun – Fivell
有些系統中還有一些(通常位於/ usr/bin/flock) - 問題沒有指定操作系統。 –
與flock有關的問題是你不能用一個以上的參數運行一個命令,所以'rake task_name'是兩個參數,因此失敗。 – yekta