2012-01-03 36 views
2

我正在設計一個長時間運行的進程,由Django管理命令觸發,需要在相當頻繁的基礎上運行。這個過程應該每5分鐘通過一個cron作業來運行,但是我想阻止它在第一個需要5分鐘以上的罕見情況下運行第二個過程實例。防止管理命令一次運行多個

我想過創建一個觸摸文件,在管理進程啓動時創建並在進程結束時刪除。然後,第二個管理命令過程將在運行之前檢查以確保觸摸文件不存在。但是,如果某個進程在沒有正確刪除觸摸文件的情況下突然死亡,那看起來就像是個問題。似乎有一個更好的方法來做這個檢查。

有沒有人知道有什麼好的工具或模式來幫助解決這類問題?

+0

ps -ef怎麼樣? (或[PSI](http://www.psychofx.com/psi/)) – danihp 2012-01-03 21:13:10

+1

FWIW,觸摸文件方法的簡單修復方法是在每次迭代或步驟中繼續觸摸文件。然後,您可以檢查文件的修改日期(如果存在),並在合理的時間內未修改文件時忽略/刪除它。 – 2012-01-03 22:52:34

+0

謝謝克里斯。這似乎是一個不錯的輕量級方法。 – 2012-01-03 23:38:03

回答

3

因此,我寧願有一個長時間運行的進程從共享隊列中獲取工作。長期來看,我的意思是說,它的一生比一個單位的工作長。然後,該進程由一些守護程序服務(如supervisord)控制,該服務可以在發生崩潰時接管重新啓動進程的控制權。這將工作恰當地委託給瞭解如何管理流程生命週期並使您不必擔心腳本範圍內posix流程的實質。

如果你有一個隊列,你也可以啓動多個進程,每個進程可以將工作從隊列中移出並處理,但這聽起來像是超出了你的問題範圍。

+0

謝謝邁克爾,芹菜可能是要走的路。我想我可以有一份工作來執行我的管理命令(或其他),並且當它完成時,讓它安排另一份工作,最近的時間爲5分鐘。我想這樣可以防止它一次運行多個實例。 – 2012-01-03 23:37:19

+0

或者只是長時間運行的過程每5分鐘喚醒一次,顯然如果它已經在5分鐘的時間內運行,就會避免這種邏輯。 – 2012-01-04 00:13:41