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...