我用crontab在某些時候調用rake任務,例如運行的進程:每3小時如何保證rake任務一次只能
我要確保的crontab準備執行rake任務時 它可以檢查rake任務正在運行。如果是這樣就不要執行。
如何做到這一點。謝謝。
我用crontab在某些時候調用rake任務,例如運行的進程:每3小時如何保證rake任務一次只能
我要確保的crontab準備執行rake任務時 它可以檢查rake任務正在運行。如果是這樣就不要執行。
如何做到這一點。謝謝。
你可以爲此使用一個鎖定文件。當任務運行時,如果獲得鎖,請嘗試抓取鎖並運行rake任務。如果你沒有拿到鎖,那麼不要運行耙子;你可能想在某處記錄一個錯誤或警告,或者你可能會在你知道它之前幾個星期或幾個月沒有做任何事情。當rake退出時,解鎖鎖定文件。
像RAA之類的東西可能會有幫助,但我沒有使用它,所以可能不會。
您也可以使用PID文件。你將有一個文件保存rake進程進程ID。在開始耙子之前,您從該文件讀取PID並查看過程是否正在運行;如果不是,則啓動rake並將其PID寫入PID文件。當rake存在時,刪除PID文件。如果你想要非常嚴格的話,你會希望將它與鎖定PID文件結合起來,但這取決於你的特定情況。
task :my_task do
pid_file = '/tmp/my_task.pid'
raise 'pid file exists!' if File.exists? pid_file
File.open(pid_file, 'w'){|f| f.puts Process.pid}
begin
# execute code here
ensure
File.delete pid_file
end
end
,因爲我覺得這是非常有用的,我會離開這裏了這一點。
添加到您的Gemfile:
gem 'pidfile', '>= 0.3.0'
,任務可以是:
desc "my task"
task :my_task do |t|
PidFile.new(piddir: "/var/lock", pidfile: "#{t.name}.pid")
# do something
end
應該嘗試使用羊羣... – Stephen 2016-05-17 17:28:28
所有你需要的是一個名爲pidfile寶石:
非常感謝。 – www 2010-10-21 09:09:33
'flock'你可以試試:] – gonjay 2015-11-30 06:01:29