qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          編寫Linux定時處理程序

            本文要寫的Linux定時處理程序,想必這是很多Linux開發人員需要處理的問題。例如編寫一個每天數據入庫程序,編寫一個定時郵件通知程序等等。

            對于定時處理程序,主要有兩種方法可以實現。一種是使用crontab來做程序的定時啟動,實現定時處理功能,一種是通過守護進程,間隔一段時間處理一次。

            下面對這兩種實現做一些分析。

            crontab 是用來設置被周期性執行的指令。可以設置每隔一段時間執行一次程序,執行的方法是新建一個進程來進行處理。通過編寫一個cronfile定時處理文件即可,例如每隔20分鐘,執行一個backup操作:

          */20 * * * * /usr/bin/backup

            程序會在0分,20分,40分的時候啟動一個/usr/bin/backup進程。

             crontab的優點是可以指定確切的時間點啟動程序,可以準確控制每次執行的間隔(兩次開始執行程序的時間間隔)。但是由于crontab每次是通過 新建一個進程來進行處理,如果間隔時間太短以至于上一個進程還未處理完,卻已啟動第二次處理,這時兩個同樣的進程在運行,必定就有一些資源的競爭和沖突。 如果通過進程本身的程序區兼容這種競爭,會讓程序變得過于復雜。如果是對執行時間點沒有很高要求,可以在每次啟動程序時先做進程檢查,如果檢查到上次程序 還未處理完,跳過本次處理或者延后本次處理時間。crontab的另一個缺點就是無法監控到定時程序的執行(有的程序處理時間只有零點幾秒,難以進行定時 掃描)。如果由于crontab本身漏洞或是系統本身問題引起crontab失效(生產機器發生過這種問題),這對于排查問題是比較麻煩的。

            編寫定時程序的另一個方式是通過守護進程來實現,守護進程是一種脫離終端并且在后臺運行的進程。用守護方式來編寫定時程序就如:

          while(true)
          {
              process.....
              sleep(SLEEP_TIME);
          }

             原理就是一個死循環,每次處理完之后休眠一段時間,再進行下一次處理。這種實現方式的好處就是可以避開資源的競爭,因為處理都是順序進行,處理完一次之 后才進行下一次處理。并且守護進程是比較好監控,它是一個常駐內存的程序,只需定時掃描進程就可很好監控程序的執行。擁有常駐內存的特性,這可以大大減少 數據的載入操作,一次載入,永久使用。

            當然,編寫守護程序來實現定時也有一些缺點,它并不適用于需要在確切時間點啟動的程序(例如需要每天8點鐘定時運行的程序),只能適合周期性,但是對運行時間點沒有要求的處理。并且守護進行處理不能準確控制每次處理的間隔,它只能控制上次處理結束到下次啟動的間隔。

             總的來說,這兩個處理方式都能實現定時處理的任務,但是對于定時意義,還是有所差別。crontab的定時,是確定每一次執行時間點,每次啟動進程的間 隔一致;而守護進程的定時,是確定上一次處理結束到下一次處理結束的時間間隔。使用時需要根據具體使用場景選擇。crontab在定時處理上,相對靈活一 些,但需要注意資源競爭以及對執行的監控。而守護進程,效率相對高一些,并且方便監控,但需確定程序對于執行時間點是否有較高的要求。

          posted on 2012-09-04 09:52 順其自然EVO 閱讀(253) 評論(0)  編輯  收藏 所屬分類: linux

          <2012年9月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 洪湖市| 乐业县| 灵山县| 翼城县| 万年县| 乃东县| 金华市| 四会市| 礼泉县| 汽车| 镇江市| 景洪市| 镇沅| 松原市| 绥中县| 诸暨市| 苍南县| 五大连池市| 禹城市| 营口市| 平谷区| 马山县| 利津县| 海兴县| 肥乡县| 夹江县| 射阳县| 容城县| 个旧市| 大同县| 邵东县| 鲜城| 莱州市| 毕节市| 朔州市| 永吉县| 苏尼特左旗| 沾益县| 荔波县| 广汉市| 资兴市|