歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 編寫Linux定時處理程序

編寫Linux定時處理程序

日期:2017/3/6 14:26:40   编辑:關於Unix
本文要寫的Linux定時處理程序,想必這是很多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在定時處理上,相對靈活一 些,但需要注意資源競爭以及對執行的監控。而守護進程,效率相對高一些,並且方便監控,但需確定程序對於執行時間點是否有較高的要求。

Copyright © Linux教程網 All Rights Reserved