Linux定時器
Crond定時任務服務應用
1、cron 定時任務的名字
2、cron 定時任務程序名
3、crontab 管理定時任務命令
檢查crond服務相關的軟體包
[root@localhost opt]# rpm -qa | grep cron cronie-1.4.11-19.el7.x86_64 cronie-anacron-1.4.11-19.el7.x86_64 yum-cron-3.4.3-167.el7.centos.noarch crontabs-1.11-6.20121102git.el7.noarch
檢查cron服務是否執行
[root@localhost opt]# systemctl status crond #centos7 ● crond.service- Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since 一 2020-11-23 10:34:46 CST; 6 years 4 months left Main PID: 733 (crond) CGroup: /system.slice/crond.service └─733 /usr/sbin/crond -n
[root@localhost opt]#service crond status #centos6
cron任務分為兩類
系統的定時任務
cron服務除了會在工作時檢視、car、spool、cron資料夾下的定時任務檔案以外,還會檢視/etc/cron/.d目錄以及/etc/anacrontab下面的檔案內容,裡面存放每天、每週、每月需要執行的系統任務
[root@localhost opt]# ll /etc/| grep cron* -rw-------. 1 root root 541 4月 11 2018 anacrontab drwxr-xr-x. 2 root root 21 11月 23 2020 cron.d #系統的定時任務 drwxr-xr-x. 2 root root 65 11月 24 2020 cron.daily #每天的定時任務 -rw-------. 1 root root 0 4月 11 2018 cron.deny drwxr-xr-x. 2 root root 46 11月 24 2020 cron.hourly #每小時執行的任務 drwxr-xr-x. 2 root root 6 6月 10 06:14 cron.monthly #每月的定時任務 -rw-r--r--. 1 root root 452 12月 8 2020 crontab drwxr-xr-x. 2 root root 6 6月 10 06:14 cron.weekly #每週的定時任務
系統定時任務配置檔案/etc/crontab
[root@localhost opt]# 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
#每一行,就是一條週期性任務
user-name 是以某一個使用者身份執行任務
command to be executed 任務是什麼
使用者定時任務計劃
當系統管理員(root)或者普通使用者(xiaolin)建立了需要定期執行的任務,可以使用crontab命令配置,crond服務在啟動時,會每分鐘檢視/car/spool/cron路徑下以系統使用者名稱命名的定時任務檔案,以確定是否需要執行的任務
[root@localhost opt]# ll /var/spool/cron 總用量 4 -rw-------. 1 root root 62 12月 8 2020 root #檢視此root定時任務檔案的內容 [root@localhost opt]# cat /var/spool/cron/root */5 * * * * /user/sbin.ntpdate nep1.aliyun.com & > /dev/null #等用於crontab -l 命令
crontab命令
crontab命令備用來提交和管理使用者的需要週期性執行的任務,與windows下的計劃任務類似
引數 | 解釋 | 使用示例 |
-l | list檢視定時任務 | crontab -l |
-e | edit編輯定時任務,建議手動編輯 | crontab -e |
-i | 刪除定時任務,,提示使用者確認刪除,避免刪錯 | crontab -i |
-r | 刪除定時任務,移除/var/spool/cron/username檔案,全沒了 | crontab -r |
-u user | 指定使用者執行任務,root可以管理普通使用者的任務計劃 | crontab-u xiaolin-l |
crontab命令就是修改/var/spool/cron中的定時任務檔案
使用者檢視定時任務
crontab -d #列出使用者設定的定時任務,等於cat /var/spool/cron/root crontab -e #編輯使用者的定時任務,等於如上命令 vi /var/spool/cron/root檔案
檢查crond服務是否執行
[root@localhost opt]# systemctl is-active crond active [root@localhost opt]# ps -ef|grep crond root 733 1 0 6月27 ? 00:00:08 /usr/sbin/crond -n root 22463 31737 0 12:22 pts/0 00:00:00 grep --color=auto crond
定時任務相關的檔案
/var/spool/cron 定時任務的配置檔案所在目錄 /var/log/cron 定時任務日誌檔案 /etc/cron.deny 定時任務黑名單
定時任務日誌格式介紹
定時任務語法格式
口訣:什麼時候做什麼是
檢視定時任務配置檔案
[root@localhost opt]# 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 #周幾(Sunday=0 or 7)週日=0或7
# | | | | |
# * * * * * user-name command to be executed
案例
每天上午8點30,去上學 30 08 * * * go to school 每天晚上12點回家回家睡覺 00 00 * * * go home
定時任務符號
crontab任務配置基本格式: * * * * * command 分鐘(0-59) 小時(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令 第1列表示分鐘1~59 每分鐘用*或者 */1表示 第2列表示小時1~23(0表示0點) 第3列表示日期1~31 第4列表示月份1~12 第5列標識號星期0~6(0表示星期天) 第6列要執行的命令 (注意:day of month和day of week一般不同時使用) (注意:day of month和day of week一般不同時使用) (注意:day of month和day of week一般不同時使用)
時間表示法:
特定值,時間點有效取值範圍內的值
萬用字元,某時間點有效範圍內的所有值,表示“每”的意思
特殊符號 | 含義 |
* | *號表示“每”的意思,如00 23 cmd表示每月每週每日的23:00整點執行命令 |
- | -號表示時間的範圍分隔符,如8-10,代表每天的8、9、10執行命令 |
, |
,號,表示分割時段,30 5,7表示每天的5點和7點執行命令 |
/n | n表示可以整除的數字,每隔n的單位時間,如隔10分鐘表示*/10 |
示例:
0 * * * * 每小時執行,每小時的整點執行 1 2 * * 4 每週執行,每週四的凌晨2點1分執行 1 2 3 * * 每月執行,每月的3號的凌晨2點1分執行 1 2 3 4 * 每年執行,每年的4月份3號的凌晨2點1分執行 1 2 * * 3,5 每週3和週五的2點1分執行 * 13,14 * * 6,0 每週六、週日的下午1點和2點的每一分鐘都執行 0 9-18 * * 1-5 週一到週五的每天早上9點一直到下午6點的每一個整點(工作日的每個小時整點) */10 * * * * 每隔10分鐘執行一次任務 *7 * * * * 如果沒法整除,定時任務則沒意義,可以自定製指令碼控制頻率 定時任務最小單位是分鐘,想完成秒級任務,只能通過其他方式(程式語言)
*/1 * * * * /bin/sh /scripts/data.sh #每分鐘執行命令
30 3,12 * * * /bin/sh /scripts/data.sh #每天的凌晨3點半,和12點半執行指令碼
30 */6 * * * /bin/sh /scripts/data.sh #每隔6小時,相當於6、12、18、24點的半點時刻,執行指令碼
30 8-18/2 * * * /bin/sh /scripts/data.sh # 30代表半點,8-18/2表示早上8點到下午18點之間每隔兩小時也就是8、10、12、14、16、18的半點時刻執行指令碼
30 21 * * * /opt/nginx/sbin/nginx -s reload #每天晚上9點30重啟nginx
45 4 1,10 * * /bin/sh /scripts/data.sh #每月的1、10號凌晨4點45執行指令碼
10 1 * 6,0 /bin/sh /scripts/data.sh #每週六、週日的凌晨1點10分執行命令
0,30 18-23 * * * #每天的18點到23點之間,每隔30分鐘執行一次
00 */1 * * * /bin/sh /scripts/data.sh #每隔一小時執行一次
00 11 * 4 1-3 /bin/sh /scripts/data.sh #4月份的週一到週三的上午11點執行指令碼
# 每天早上7點到上午11點,每2小時執行cmd命令
00 07-11/2 * * * CMD
0 6 * * * /var/www/test.sh #每天6點執行指令碼
0 4 * * 6 /var/www/test.sh #每週六凌晨4:00執行
5 4 * * 6 /var/www/test.sh #每週六凌晨4:05執行
40 8 * * * /var/www/test.sh #每天8:40執行
31 10-23/2 * * * /var/www/test.sh #在每天的10:31開始,每隔2小時重複一次
0 2 * * 1-5 /var/www/test.sh #每週一到週五2:00
0 8,9 * * 1-5 /var/www/test.sh #每週一到週五8:00,每週一到週五9:00
0 10,16 * * * /var/www/test.sh #每天10:00、16:00執行
生產環境使用者配置定時任務流程
需求:每分鐘向/opt/log檔案中寫入一句話“hello wenchang”
第一步:建立檔案/opt/log
[root@localhost opt]# ll 總用量 4 drwxr-xr-x. 2 root root 6 12月 8 2020 - drwxr-xr-x. 2 root root 6 12月 8 2020 9{a-z} -rw-r--r--. 1 root root 81 12月 8 2020 bak.sh -rw-r--r--. 1 root root 0 7月 13 12:51 log drwxr-xr-x. 2 root root 6 12月 8 2020 p
第二步,編輯定時任務檔案,寫入需要定時執行的任務
[root@localhost opt]# crontab -e * * * * * /usr/bin/echo"hello wenchang" >> /opt/log
第三步,檢查定時任務
[root@localhost opt]# crontab -l * * * * * /usr/bin/echo "hello wenchang" >> /opt/log
第四步:可以檢測檔案內容
[root@localhost opt]# tail -f /opt/log
hello wenchang
每5分鐘讓伺服器進行同步時間
[root@localhost opt]# crontab -e */5 * * * * /user/sbin.ntpdate nep1.aliyun.com & > /dev/null
每晚0點整,把站點目錄/var/www/html下的內容打包備份到/date目錄下
提醒,tar命令不建議使用絕對路徑打包,特殊情況可以使用-P引數
1.檢查資料夾是否存在,不存在則建立 [root@pylinux ~]# ls -d /var/www/html /data ls: 無法訪問/var/www/html: 沒有那個檔案或目錄 ls: 無法訪問/data: 沒有那個檔案或目錄 2.建立資料夾 [root@pylinux ~]# mkdir -p /var/www/html /data [root@pylinux ~]# ls -d /var/www/html /data /data /var/www/html 3.建立測試檔案 [root@pylinux ~]# touch /var/www/html/chaoge{1..10}.txt [root@pylinux ~]# ls /var/www/html/ chaoge10.txt chaoge1.txt chaoge2.txt chaoge3.txt chaoge4.txt chaoge5.txt chaoge6.txt chaoge7.txt chaoge8.txt chaoge9.txt 4.打包壓縮命令 [root@pylinux www]# tar -zcvf /data/bak_$(date +%F).tar.gz ./html/
編寫shell指令碼
[root@pylinux scripts]# cat bak.sh #!/bin/bash cd /var/www && \ /bin/tar -zcf /data/bak_$(date +%F).tar.gz ./html
crontab -e 寫入 00 00 * * * /bin/sh /server/scripts/bak.sh > /dev/null 2>&1 #/server/scripts/bak.sh 指令碼存放路徑 #解釋 >/dev/null 2>&1 代表把所有輸出資訊重定向到黑洞檔案 > 是重定向符號 /dev/null是黑洞檔案 2>&1 代表讓標準錯誤和標準輸出一樣 此命令表示將指令碼執行的正常或者錯誤日誌都重定向到/dev/null,也就是什麼都不輸出 >/dev/null 2>&1 等價於 1>/dev/null 2>/dev/null 等價於 &> /dev/null
取消定時任務發郵件功能
1.定時任務的命令 > /dev/null #命令的執行正確結果輸出到黑洞,標準錯誤還是報錯 2.定時任務的命令 &> /dev/null #組合符 &> 正確和錯誤的輸出,都寫入黑洞,危險命令,有風險,慎用
補充anacron
如果由於機器故障關機,定時任務未執行,下次開機也不會執行任務
使用anacron下次開機會掃描定時任務,將未執行的,全部執行,服務區很少關機重啟,所以忽略。