編寫Linux定時處理程序

openkk 12年前發布 | 17K 次閱讀 Linux

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

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

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

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

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

程序會在0分,20分,40分的時候啟動一個/usr/bin/backup進程(具體用法可參加:http://baike.baidu.com/view/1229061.htm)。

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

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

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

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

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

轉自:http://blog.csdn.net/tigernorth/article/details/7670768

 

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!