Linux命令學習之crontab

2021-08-22 04:37:04 字數 3647 閱讀 6923

crontab檔案包含送交cron守護程序的一系列作業和指令。每個使用者可以擁有自己的crontab檔案;同時,作業系統儲存乙個針對整個系統的crontab檔案,該檔案通常是/etc/crontab,而這個檔案只能由系統管理員來修改。

使用者的crontab檔案存放在 /var/spool/cron/username # crontab -e -u username

a、每一行定義乙個週期性任務,共6個字段。

b、此處的環境變數不同於使用者登入後獲得的環境,因此建議命令使用絕對路徑。

c、執行結果會傳送郵件給當前使用者。

星號(*)匹配所有有效的值。

短橫線(-)表示範圍連續取值。

逗號(,)表示離散取值。

正斜線(/)指定間隔頻率。例如,0-59/2 在分鐘字段表示每兩分鐘。

*/5 * * * * 每5分鐘執行一次 

3 * * * * 每小時的第3分鐘執行一次 

3 4 * * 5 每週5的4點3分執行一次 

5 6 7 * * 每月的7號的6點5分執行一次 

7 8 9 10 * 每年的10月9號8點7分執行一次 

9 8 * * 3,7 每週3和週日的8點9分

0 8,20 * * 3,7 每週3和週日的8點和20點執行一次

0 9-18 * * 1-5 周一到周五的9-18點,即工作時間內的每小時

0 7 25 12 * 每年的12月25號7點執行一次

---------------------------------------update 2023年3月17日13:45:52----------------------------------------

在實際運用crontab 啟動程式的時候經常會遇到一結果問題就是,某指令碼程式執行一次時間小於30mins,為了安全起見將指令碼的執行頻率調節到每一小時執行一次,這樣兼顧了時效性,也確保了安全性。 可是如果某次程式由於執行時間超過了30mins。就不能保證上次執行完,會有double run的問題,crontab的執行時非同步執行的

,那如何保證crontab的指令碼執行不出現double run的情形呢?

在inux中借助lockf機制,

保證只有乙個任務程序在執行。

lockf –help

-k 鎖定檔案,如果當前檔案被鎖,則輸出 lockf:/tmp/create/lock :already locked

-s 鎖定檔案,不輸出任何資訊 silent

-t second :超時時間,超時就退出

應用示例:

lockf -s -t 0 /log/tmp.lock a.sh
先判斷/log/tmp.lock 檔案是否被鎖,被鎖則立即退出,否則將會執行後面的指令碼。

第一次執行會給/log/tmp.lock檔案上鎖

,並執行後面的命令,(如果不存在則建立)

當第二次執行該命令時,/log/tmp.lock檔案已經被鎖

,命令將會直接退出,而不會去執行後面的a.sh 的指令碼。

實戰:一、排程對gp的表做vacuum freeze,這個操作的時間不定,由於每次是找出age top 20的表做,如果上乙個沒跑完下一次又開始,其實找到的大部分都是一樣的top 20. 最好的解決方案就是第二次執行的時候一定要等第一次執行完。

解決: 

2、使用flock 

這個鎖檔案可以是任何檔案。此處是直接在該目錄下touch了乙個空檔案

*/5 * * * * flock -xn  /gpmaster/scripts/freezetoptable.sock -c 'sh /gpmaster/scripts/freezetoptable.sh dbname'
flock的幾個引數

-s, --shared:    獲得乙個共享鎖

-x, --exclusive: 獲得乙個獨佔鎖

-u, --unlock:    移除乙個鎖,通常是不需要的,指令碼執行完會自動丟棄鎖

-n, --nonblock:  如果沒有立即獲得鎖,直接失敗而不是等待

-w, --timeout:   如果沒有立即獲得鎖,等待指定時間

-o, --close:     在執行命令前關閉檔案的描述符號。用於如果命令產生子程序時會不受鎖的管控

-c, --command:   在shell中執行乙個單獨的命令

-h, --help       顯示幫助

-v, --version:   顯示版本

------------------------------------update 2023年8月15日11:14:27-----------------------------

如果希望某個指令碼每小時執行一次,應該怎麼寫?

* */1 * * *
初次寫成這個,發現竟然是每分鐘都在執行,其實這裡出現了乙個致命的錯誤中。

分鐘域為每分鐘,但是小時域為每間隔1h,這兩個時間策略本身自相矛盾,最終以分鐘為準,所以它是每分鐘執行一次。

正確的寫法是:

0/60 * * * *
當前時間是11:20 ,每間隔1h執行,會以當前時間的整點為起始時間計算。

當前時間是11:20 ,每間隔55mins執行,會以當前時間的整點向後推55mins為起始時間計算。

看這個結果為啥整點還會執行一次呢?事實上這也是乙個時間策略衝突的例子。 小時域是* ,所以我整點就可以執行啊,所以crontab就執行了。

所以,「 */n * * * * 」  當 n 不能被 60 整除的時候,就不是:每 n 分鐘執行一次。

如果我希望是每天的10點到23點12:20 13:20 該怎麼處理呢?

強大的crontab 肯定是可以做到的。

再看乙個例子

*代表所有的取值範圍內的數字,"/"代表每的意思,"/2"表示每2個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字。只要理解了這句話,這個表示式就容易理解。 

另外給大家推薦乙個好用的crontab檢查器

linux學習之命令

系統時間檢視 date 系統時間修改,系統重啟後修改會失效 date s 2019 06 27 21 21 21 硬體時間檢視 hwclock 硬體時間修改 hwclock set date 2019 06 27 21 21 21 硬體時間與系統時間同步 hwclock hctosys 修改時區 c...

Linux命令學習之tar命令

歸檔資料 功能長名稱 描述 a concatenate 將乙個已有的tar檔案追加到另乙個已有tar歸檔檔案 c create 建立乙個新的歸檔檔案 d diff 檢查歸檔檔案和文i下哦那個的不同之處 d delete 從已有tar歸檔中刪除 r追加檔案到已有他人歸檔檔案末尾 t list 列出已有...

Linux命令學習之grep命令

格式 grep options pattern file grep命令堆在輸入或指定的檔案中查詢包含匹配指定模式的字元的行。grep的輸出就是包含了匹配模式的行。原始檔內容 ocetl yxddn65 demo more file12 46315 9510 ocetl yxddn65 demo gr...