編寫Linux定時處理程式

2021-06-07 04:40:43 字數 1456 閱讀 8037

挺久沒寫blog了,覺得自己的確有點懶,還是得改改這個壞習慣。知識還是需要沉澱一下,並且可以跟大家分享分享。

本文要寫的linux定時處理程式,想必這是很多linux開發人員需要處理的問題。例如編寫乙個每天資料入庫程式,編寫乙個定時郵件通知程式等等。

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

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

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

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

程式會在0分,20分,40分的時候啟動乙個/usr/bin/backup程序(具體用法可參加:

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

編寫定時程式的另乙個方式是通過守護程序來實現,守護程序是一種脫離終端並且在後台執行的程序。用守護方式來編寫定時程式就如:

while(true)

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

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

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

python編寫定時關機程式

import os,sys,time from pyqt5 import qtcore,qtwidgets,qtgui class guanji object defpageshow self,page 設定視窗的位置和大小 page.setgeometry 400,400,400,200 設定視窗...

linux 編寫服務程式

以前我們在看 unix環境高階程式設計 的時候,有專門的整章詳細介紹如何編寫乙個後台daemon程式 精靈程式 主要涉及到建立會話組,切換工作目錄,設定檔案遮蔽字,關閉不必要的描述符等多個操作。這些操作對於每乙個後台程式來說都是類似的。在linux中專門提供了乙個函式來完成這個daemon化的過程,...

Linux驅動編寫 定時中斷

1 定義乙個新的定時器結構體 結構體變數 struct time list time 2 對新的定時器初始化 結構體賦值 setup timer timer,fn,data 3 編寫定時中斷服務函式 4 啟動定時器 add timer struct timer list timer int mod ...