1. 程式人生 > 其它 >[Linux之crond計劃任務、定時任務]

[Linux之crond計劃任務、定時任務]

[Linux之crond計劃任務、定時任務]

⼀ 定時任務介紹

1、什麼是定時任務?

設定某個⽇期或時間週期性執⾏指令。⽐如設定⼀個鬧鈴,叫你每天早上7點鐘起床等,這就是⼀個定時任務。

2、什麼是Crond?

Crond是Linux系統中⽤來定期執⾏命令或指令碼的⼀種服務軟體,⼀般情況下,我們安裝完CentOS作業系統之後,預設便會啟動Crond任務排程服務。
Crond服務會定期(預設每分鐘檢查⼀次)檢查系統中是否有要執⾏的任務⼯作,如果有,便會根據其預先設定的定時任務規則⾃動執⾏該定時任務⼯作,這個Crond定時任務服務就相當於我們平時早起使⽤的鬧鐘⼀樣。

3、crond⽇志⽂件

/var/log/cron

4、為什麼要使⽤定時任務?

定期備份資料,定期執⾏指令碼程式
我們舉個例⼦說明:例如,我們的資料庫或者程式碼程式需要每天晚上0點做⼀次備份,這樣每天夜⾥都需要執⾏的週期性⼯作,如果要讓⼈操作的話,就得每天半夜爬起來,然後登入系統執⾏任務,執⾏完接著睡覺。另外,執⾏任務的過程也可能持續⼏個⼩時,這樣⼀來,⼀個晚上我們就都不⽤睡覺了,這樣顯然是不⾏的。那麼有什麼辦法來解決這個週期性的執⾏任務需求呢?
這就是Linux系統的定時任務Crond,這相當於我們平時⽣活中的鬧鐘功能,每天晚上提前設定定時,早晨按時叫醒你。

5、 定時任務主要分為以下兩種使⽤情況。

(1)系統級別的定時任務:

臨時⽂件清理例/tmp和/var/tmp等、系統資訊採集、⽇志⽂件切割

(2)⽤戶級別的定時任務:

定時向互聯⽹同步時間、定時備份系統配置⽂件、定時備份資料庫的資料

⼆ 定時任務管理

2.1 系統級計劃任務

定義⽅式⼀:編輯⽂件/etc/crontab

[root@localhost ~]# vim /etc/crontab
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR
sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

# * 分別代表
# 分
# 時
# ⽇
# ⽉
# 周

定義⽅式⼆:把指令碼放到該⽬錄下

/etc/cron.hourly/ # 系統定時任務每個⼩時運⾏這個⽬錄⾥的內容

/etc/cron.daily/ # 系統定時任務每天運⾏這個⽬錄⾥的內容

/etc/cron.weekly/ # 系統定時任務每週運⾏這個⽬錄⾥的內容

/etc/cron.monthly/ # 系統定時任務每⽉運⾏這個⽬錄⾥的內容

2.2 ⽤戶級計劃任務

[root@localhost ~]# crontab -e # 建立計劃任務
* * * * * /bin/ls

[root@localhost ~]# crontab -l # 檢視計劃任務
* * * * * /bin/ls

[root@localhost ~]# ls /var/spool/cron/
root

[root@localhost ~]# cat /var/spool/cron/root # 都是寫在這⾥呢
* * * * * /bin/ls

[root@localhost ~]# tail /var/log/cron # 檢視⽇志

[root@localhost ~]# crontab -u egon -e

# /etc/cron.deny 是定時任務的⿊名單,使⽤root將需要拒絕的⽤戶加⼊/etc/cron.deny

[root@localhost ~]# echo "egon" >> /etc/cron.deny

[root@localhost ~]# su - egon # 登陸該普通⽤戶,⽆法編寫定時任務

上⼀次登入:四 8⽉ 13 19:44:10 CST 2020pts/1 上 [egon@localhost ~]$ crontab -e

You (egon) are not allowed to use this program (crontab)
See crontab(1) for more information

2.3 計劃任務語法格式

注意:crond是按照分鐘進⾏計算的,不⽀持秒

  * 表示任意的(分、時、⽇、⽉、周)時間都執⾏

  - 表示⼀個時間範圍段, 如5-7點

  , 表示分隔時段, 如6,0,4表示週六、⽇、四

  /1 表示每隔n單位時間, 如*/10  就是每10分鐘

瞭解定時任務crontab的編寫規範。

00 02 * * * #每天的凌晨2點整執⾏

00 02 1 * * #每⽉的1⽇的凌晨2點整執⾏

00 02 14 2 * #每年的2⽉14⽇凌晨2點執⾏

00 02 * * 7 #每週天的凌晨2點整執⾏

00 02 * 6 5 #每年的6⽉週五凌晨2點執⾏

00 02 14 * 7 #每⽉14⽇或每週⽇的凌晨2點都執⾏

00 02 14 2 7 #每年的2⽉14⽇或每年2⽉的周天的凌晨2點執⾏

*/10 02 * * * #每天凌晨2點,每隔10分鐘執⾏⼀次

* * * * * #每分鐘都執⾏

00 00 14 2 * #每年2⽉14⽇的凌晨執⾏命令

*/5 * * * * #每隔5分鐘執⾏⼀次

00 02 * 1,5,8 * #每年的1⽉5⽉8⽉凌晨2點執⾏

00 02 1-8 * * #每⽉1號到8號凌晨2點執⾏

00 21 * * * #每天晚上21:00執⾏

45 4 1,10,22 * * #每⽉1、10、22⽇的4:45執⾏

45 4 1-10 * * #每⽉1到10⽇的4:45執⾏

3,15 8-11 */2 * * #每隔兩天的上午8點到11點的第3和第15分鐘執⾏

0 23-7/2 * * * #晚上11點到早上7點之間,每隔兩⼩時執⾏

15 21 * * 1-5 #周⼀到週五每天晚上21:15執⾏

crontab不執⾏的問題

第⼀,指令碼的原因:⼤多數情況下,我們要相信科學,相信計算機,不是有⻤,就是我們的指令碼的問題,這種問題導致crontab不能執⾏的概率佔到 70%以上。因為程式執⾏到某⼀步導致crontab終⽌執⾏,我就碰到⼀次在遷移程式碼的時候將資料庫連錯了。導致⽆法訪問⽽死在那⾥了。


第⼆,執⾏環境問題,當我們碰到第⼀情況下,⼀般都可以通過⼿動執⾏程式將問題扼殺在搖籃⾥,⼀般情況下⾼⼿是不應該犯第⼀種錯誤的。問題是當我們 ⼿動執⾏成功⽽crontab不能執⾏的時候,筆者碰到⼀次就是執⾏環境的問題,例如相關路徑的設定問題。解決⽅案:在程式碼最前⾯執⾏ source/home/user/.bash_profile


第三,系統時間不正確。這種問題最好理解,也是⽐較常⻅和隱蔽的問題,解決⽅案:date -s ********


第四,就是我們的指令碼是否有可執⾏許可權。必須保證執⾏指令碼的⽤戶有執⾏改⽂件的許可權。


第五,crontab 守護程序死掉了。這種情況是極少發⽣的,但也不排除,當我們實在是找不到其他原因的時候可以⽤。解決⽅案:重啟該程序。


第六,crontab不執⾏的問題困擾了好⻓時間,指令碼寫的都正確,但是就是不執⾏,最終解決⽅法如下:
crontab -u root /var/spool/cron/root這樣root⽤戶的crontab就⽣效了
[root@localhost ~]# systemctl restart crond
重啟下服務就好了


第七,crond沒有啟動


第⼋,指令碼編碼問題,指令碼在window下編寫,傳到linux下後報“鍩?!/bin/bash”,⽤vi編輯器新建shell
指令碼,輸⼊內容後儲存。


第九* * * * * tar czf /tmp/`date '+%Y'` /etc 該計劃任務中命令的執⾏流程是crond->tar命令,⽽crond在執⾏tar命令時,⽆法識別萬用字元%的意思(shell能識別),所以該命令⽆法正常執⾏改正結果:* * * * * tar czf /tmp/`date '+\%Y'` /etc通常都會把要執⾏的操作放到⽂件中,然後/bin/bash a.sh去執⾏,* * * * * /bin/bash a.sh ,這樣的執⾏流程就變成了crond->bash shell->a.sh,這樣a.sh內即便是寫%號,也能被識別出來

四、定時發郵件

定時發郵件點我

總結:9句箴⾔

1.定時任務規則之前加註釋

2.使⽤指令碼執⾏定時任務(只有⼀條簡單命令的可以直接使⽤命令執⾏)

3.運⾏指令碼⼀定要⽤絕對路徑執⾏,統⼀指令碼位置。

4.定時任務中date命令的百分號需轉義才能使⽤。

5.命令或指令碼結果(正確及錯誤)定向到空(>/dev/null 2>&1)或追加到⽂件中 >>/tmp/oldboy.txt 2>&1

6.避免不必要的程式及命令輸出,如打包命令,tar -v的顯示過程的選項。

7.打包壓縮使⽤相對路徑(切到⽬標⽬錄的上⼀級打包⽬標)

8.定時任務指令碼中的程式⽂件 ,儘量⽤絕對路徑,⽤戶的定時任務中的⽂件預設存放在當前⽤戶的家⽬錄

9.系統與命令位置有關的環境變數問題,建議指令碼中重新定義環境變數PATH。