定時任務-crond
阿新 • • 發佈:2022-05-11
目錄
定時任務-crond
什麼是定時任務crond
crond是一個服務,是定時任務的守護程序
定時任務的作用
1.系統級別的定時任務
臨時檔案清理
系統資訊採集
日誌檔案切割
2.使用者級別的定時任務
定時向網際網路同步時間
定時備份系統配置檔案
定時備份資料庫的資料
定時任務語法
0 ✓ 18:16:53 [email protected],10.0.0.167:~ # vim /etc/crontab # 定時任務,支援bash命令 SHELL=/bin/bash # 定時任務只支援直接寫一下目錄中的命令(建議:定時任務中的命令全部使用絕對路徑) PATH=/sbin:/bin:/usr/sbin:/usr/bin # 定時任務執行的內容,如果有輸出,或者有報錯,則通過郵件發給root使用者 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 # 語法 寫定時任務,上來就先寫五顆星 * * * * * 使用者 命令 分 時 日 月 周 # 注意:定時任務最小單位分鐘,無法精確到秒級
定時任務相關命令
crontab -l:list 列出當前定時任務的列表 -e:edit 編輯定時任務 vim /var/spool/cron/root -r:remove 刪除定時任務(刪除全部定時任務) -u:user 指定定時任務的使用者 # 每天凌晨2點,執行一次ls命令 00 02 * * * ls >/dev/null # 每個月的1號凌晨2點執行一次ls命令 00 02 1 * * ls # 每年的2月14凌晨2點,執行一次ls命令 00 02 14 2 * ls # 每週日,凌晨2點執行一次ls命令 00 02 * * 7 ls # 每年6月份的每個週五凌晨2點執行一次ls命令 00 02 * 6 5 ls # 每年的每個月的14號恰巧又是週日的時候 00 02 14 * 7 ls # 每年的2月14號,恰巧又是週日凌晨兩點才執行ls命令 00 02 14 2 7 ls # 每天凌晨2點,每隔10分鐘執行一次ls命令 */10 02 * * * ls # 每分鐘執行一次ls命令 * * * * * ls # 每年的2月14日,00點執行一次ls 00 00 14 2 * ls # 每隔5分鐘執行一次ls命令 */5 * * * * ls # 每年的1月和5月和8月的每天凌晨2點都執行一次ls命令 00 02 * 1,5,8 * ls # 每個月的1號到8號凌晨2點執行一次ls命令 00 02 1-8 * * ls # 每天晚上21點執行一次ls命令 0 21 * * * ls # 每個月的1號 10號 和 22號的凌晨4點45分執行一次ls命令 45 4 1,10,22 * * ls # 每個月的1號到10號4點45分執行一次ls命令 45 4 1-10 * * ls # 每個月的每隔2天的8點到11點的03分和15分分別執行ls命令 3,15 8-11 */2 * * ls # 每天的1點到7點和23點到24點的整點執行一次ls命令 0 23-7/1 * * * ls # 每週的週一到週五21點15分執行一次ls命令 15 21 * * 1-5 ls
定時任務實戰
# 1.時間同步定時任務 1)需要下載時間同步命令 [root@localhost ~]# yum install -y ntpdate 2)要先測試命令是否可以在命令列執行成功 0 ✓ 18:23:41 [email protected],10.0.0.167:~ # ntpdate time1.aliyun.com 11 May 18:23:56 ntpdate[8175]: adjust time server 203.107.6.88 offset -0.206217 sec 3)編輯定時任務 3)編輯定時任務 [root@localhost ~]# crontab -e 4)寫入規則(命令複製剛才執行成功的命令) * * * * * ntpdate time1.aliyun.com 5)查詢該命令的絕對路徑 [root@localhost ~]# which ntpdate /usr/sbin/ntpdate 6)完善規則中的命令路徑 * * * * * /usr/sbin/ntpdate time1.aliyun.com 7)根據規定的時間來進行定時任務編寫 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com 8)檢視命令是否有輸出內容,如果有則扔進黑洞 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null 9)加上規範註釋 # Usage: Sync Date By:zls Date:2022/05/10 */5 * * * * /usr/sbin/ntpdate time1.aliyun.com &>/dev/null 10)檢視定時任務日誌 最開始定時任務,每分鐘執行一次,寫完之後檢視日誌。 [root@localhost ~]# tail -f /var/log/cron
需求:每天凌晨3點做一次備份
將備份命令寫入一個指令碼中
任務:
1.每天備份檔名要求格式:2018-02-20_hostname_etc.tar.gz
2.存放備份內容的目錄要求只保留3天的資料
3.在執行計劃任務時,不要輸出任務資訊
# 1.備份使用tar命令
cd / && tar zcf 2018-02-20_hostname_etc.tar.gz etc
1)實現包名加日期需求:date +%F
cd / && tar zcf `date +%F`_hostname_etc.tar.gz etc
cd / && tar zcf $(date +%F)_hostname_etc.tar.gz etc
2)實現包名加主機名需求:hostname
cd / && tar zcf `date +%F`_`hostname`_etc.tar.gz etc
cd / && tar zcf $(date +%F)_$(hostname)_etc.tar.gz etc
3)將命令寫入指令碼中
[root@zls ~]# vim backup_etc.sh
#!/bin/bash
cd / && tar zcf /backup/$(date +%F)_$(hostname)_etc.tar.gz etc
4)只保留3天的資料
find /backup -type f ! -mtime -3|xargs rm -f
5)不輸出任務資訊 在定時任務中
&>/dev/null
6)編寫定時任務
## 先手動執行一次指令碼,在命令列中
[root@localhost ~]# /bin/sh /root/backup_etc.sh
## 如果沒有報錯,再編寫定時任務
[root@zls ~]# crontab -e
## 定時任務,提高頻率先每分鐘執行一次
* * * * * /bin/sh /root/backup_etc.sh
7)優化定時任務內容
# 1.不需要輸出內容
* * * * * /bin/sh /root/backup_etc.sh &>/dev/null
# 2.滿足需求中的時間
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
# 3.加註釋
# Usage: Backup etc By:zls Date:2022/05/11
00 03 * * * /bin/sh /root/backup_etc.sh &>/dev/null
## 注意:指令碼中每新增一行內容就測試執行一次
## 優化指令碼內容
#!/bin/bash
bak_dir="/bak"
mkdir -p $bak_dir
cd / && tar zcf $bak_dir/$(date +%F)_$(hostname)_etc.tar.gz etc
find $bak_dir -type f ! -mtime -3|xargs rm -f
備份定時任務的內容
就是備份/var/spool/cron/使用者名稱
[root@zls ~]# cp /var/spool/cron/root /bak/root_cron
拒絕某個使用者使用定時任務
[root@zls ~]# vim /etc/cron.deny
zls
oldboy
abc
## 只要將使用者名稱寫入 /etc/cron.deny檔案中,則該使用者無法使用定時任務
定時任務除錯規則
1.crond除錯
1) 調整任務每分鐘執行的頻率, 以便做後續的除錯。
2) 如果使用cron執行指令碼,請將指令碼執行的結果寫入指定日誌檔案, 觀察日誌內容是否正常。
3) 命令使用絕對路徑, 防止無法找到命令導致定時任務執行產生故障。
4) 通過檢視/var/log/cron日誌,以便檢查我們執行的結果,方便進行除錯。
2.crond編寫思路
- 1.手動執行命令,然後保留執行成功的結果。
- 2.編寫指令碼
- 指令碼需要統一路徑/scripts
- 指令碼內容複製執行成功的命令(減少每個環節出錯機率)
- 指令碼內容儘可能的優化, 使用一些變數或使用簡單的判斷語句
- 指令碼執行的輸出資訊可以重定向至其他位置保留或寫入/dev/null
- 3.執行指令碼
- 使用bash命令執行, 防止指令碼沒有增加執行許可權(/usr/bin/bash)
- 執行指令碼成功後,複製該執行的命令,以便寫入cron
- 4.編寫計劃任務
- 加上必要的註釋資訊, 人、時間、任務
- 設定計劃任務執行的週期
- 貼上執行指令碼的命令(不要手敲)
- 5.除錯計劃任務
- 增加任務頻率測試
- 檢查環境變數問題
- 檢查crond服務日誌
Linux發郵件
# 1.安裝發郵件工具mailx
[root@zls ~]# yum install -y mailx
# 2.配置發件人
[root@zls ~]# vim /etc/mail.rc
## 發件人
set [email protected]
## QQ郵箱使用的郵件協議
set smtp=smtps://smtp.qq.com:465
## 發件人賬號
set [email protected]
## 發件人密碼
set smtp-auth-password=#客戶端授權碼
## 認證登入
set smtp-auth=login
## 忽略證書
set ssl-verify=ignore
## 證書存放目錄
set nss-config-dir=/etc/pki/nssdb/
set from=# 你的QQ郵箱
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=# 你的QQ郵箱登入賬號
set smtp-auth-password=# 客戶端授權碼
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
配置郵箱
登入郵箱點選設定
點選賬戶
開啟這兩項服務→點選授權碼
# 傳送郵件
echo 'test' |mail -s '這裡是標題' 郵箱
使用定時任務發情書
## 建立情書存放目錄
[root@zls ~]# mkdir /love
## 編寫情書
[root@zls ~]# vim /love/1.txt
[root@zls ~]# vim /love/2.txt
[root@zls ~]# vim /love/3.txt
[root@zls ~]# vim /love/4.txt
[root@zls ~]# vim /love/5.txt
[root@zls ~]# vim /love/6.txt
## 編寫傳送情書的指令碼
[root@zls ~]# cat /love/1.txt |mail -s '情書' [email protected]
[root@zls ~]# vim send_love.sh
#!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
cat $love_dir/$love_name |mail -s '情書' [email protected]
rm -f $love_dir/$love_name
## 編寫定時任務
1)測試指令碼傳送
[root@zls ~]# /bin/sh /root/send_love.sh
2)編輯定時任務
# Usage: Send Love By: zls Date: 2022/05/11
* * * * * /bin/sh /root/send_love.sh &>/dev/null
3)檢視日誌
[root@zls ~]# tail -f /var/log/cron
#!/bin/bash
love_dir="/love"
love_name=`ls -1 $love_dir/|head -1`
count=`ls -1 /love/|wc -l`
if [ $count -gt 0 ];then
cat $love_dir/$love_name |mail -s '情書' [email protected]
mv $love_dir/$love_name /tmp
fi