2010-10-21 28 views
4

我用crontab在某些時候調用rake任務,例如運行的進程:每3小時如何保證rake任務一次只能

我要確保的crontab準備執行rake任務時 它可以檢查rake任務正在運行。如果是這樣就不要執行。

如何做到這一點。謝謝。

回答

3

你可以爲此使用一個鎖定文件。當任務運行時,如果獲得鎖,請嘗試抓取鎖並運行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 
+0

非常感謝。 – www 2010-10-21 09:09:33

+2

'flock'你可以試試:] – gonjay 2015-11-30 06:01:29

18

,因爲我覺得這是非常有用的,我會離開這裏了這一點。

添加到您的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 
+0

應該嘗試使用羊羣... – Stephen 2016-05-17 17:28:28