1. 程式人生 > 資訊 >《胡鬧廚房》即將上線 START 雲遊戲 TV 版,大量認證電視可玩

《胡鬧廚房》即將上線 START 雲遊戲 TV 版,大量認證電視可玩

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
​
[root@localhost ~]# tail -f /var/spool/mail/root # 檢視郵件
[root@localhost ~]# tail -f /var/log/cron  # 檢視計劃任務執行情況
​
# /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 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執行

命令最好用絕對路徑

[root@localhost test]# crontab -e
[root@localhost test]# crontab -l
*  *  *  *  * ntpdate ntp.aliyun.com
您在 /var/spool/mail/root 中有郵件
​
[root@localhost test]# cat /var/spool/mail/root  | tail -3
​
/bin/sh: ntpdate: 未找到命令
        
​
[root@localhost ~]# crontab -l  # 重新修改
* * * * * /usr/sbin/ntpdate ntp.aliyun.com

注意:每執行一次計劃任務就會記錄日誌到/var/log/cron,會導致檔案過大,可以關閉郵件服務

[root@localhost test]# systemctl stop postfix.service

郵件服務停止之後,在/var/spool/postfix/maildrop/目錄下,會生成很多的小檔案,定時任務執行一次,目錄就會生成一個檔案,日積月累的話,磁碟的inode會被沾滿,導致磁碟故障,重新編寫定時任務

[root@localhost ~]# crontab -l
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null

總結:

1、檢視cron服務是否起作用:
如果我們要檢視定時任務是否準時呼叫了可以/var/log/cron中的執行資訊
cat /var/log/cron
也可以用tail -f /var/spool/mail/使用者名稱,來檢視普通使用者的計劃任務執行情況
此處需要記住兩點:
(1):cron 守護程序每分鐘都檢查 /etc/crontab 檔案、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。如果發現了改變,它們就會被載入記憶體。這樣,當某個 crontab 檔案改變後就不必重新啟動守護程序了。**
(2):crontab的使用者手冊中推薦每一個命令使用絕對路徑,例如呼叫rm命令時寫作:/bin/rm,這是為了防止由於每一個使用者的PATH環境變數不同而導致命令無法找到的錯誤。
2、編寫定時任務時,先在命令列上面執行一次,檢視是否可以執行成功。
3、把定時任務執行的結果定向到空,如果不定向到空的話,郵件服務開啟時,系統會一直髮送郵件資訊,郵件服務關閉時,系統會大量生成小檔案。

示例3:每分鐘把系統時間追加到一個檔案中,以2019-06-15_13:54:10格式

[root@localhost ~]# crontab -l
* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
務必注意加上轉義符號,因為在定時任務中,有些特殊符號會被誤解,不轉義是無法執行的。

示例4:每天凌晨3點做一次備份?將/etc/目錄進行打包,備份到/backup下面,且只能保留最近三天的資料。

[root@localhost ~]# cat /root/bak.sh 
#!bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 防止下述命令出問題
mkdir /backup
cd /
tar -czf backup/$(hostname)_$(date +\%F_\%T)_etc.tar.gz /etc   
find backup -type f -name "*.tar.gz" -mtime +3 |xargs rm -rf
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/bak.sh &>/dev/null

三 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內即便是寫%號,也能被識別出來

五 定時發郵件

https://www.cnblogs.com/linhaifeng/p/6602149.html#_label7

六 定時任務編寫思路

1.手動執行命令,然後保留執行成功的結果。

2.編寫指令碼
指令碼需要統一路徑/scripts ​ 指令碼內容複製執行成功的命令(減少每個環節出錯機率)

3.執行指令碼
使用bash命令執行, 防止指令碼沒有增加執行許可權(/usr/bin/bash /bin/bash) ​ 執行指令碼成功後,複製該執行的命令,以便寫入cron

4.編寫定時任務
加上必要的註釋資訊, 人、時間、任務
設定定時任務執行的週期
貼上執行指令碼的命令(不要手敲)

5.除錯定時任務
增加任務頻率測試
檢查環境變數問題(最好在指令碼中重新定義環境變數PATH)
檢查crond服務日誌

七 總結:9句箴言

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

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

3.執行指令碼一定要用絕對路徑執行,統一指令碼位置。

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

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

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

7.打包壓縮使用相對路徑(切到目標目錄的上一級打包目標)

8.定時任務指令碼中的程式檔案 ,儘量用絕對路徑,使用者的定時任務中的檔案預設存放在當前使用者的家目錄

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