1. 程式人生 > 實用技巧 >Linux定時器

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下次開機會掃描定時任務,將未執行的,全部執行,服務區很少關機重啟,所以忽略。