crontab命令常見於Unix和類Unix的操作系統之中,用於設置週期性被執行的指令。
該命令從標準輸入設備讀取指令,並將其存放於“crontab”文件中,以供之後讀取和執行。該詞來源於希臘語 chronos(χρνο),原意是時間。通常,crontab儲存的指令被守護進程激活, crond常常在後臺運行,每一分鐘檢查是否有預定的作業需要執行。這類作業一般稱爲cron jobs。
有點類似於鬧鐘的意味,鬧鐘是到指定時間,播報一個鈴聲,叫你起牀,這個是到指定時間,去執行某項任務。
crontab--計劃任務
常見的一些計劃任務
>每分鐘需要執行一個程序去檢查系統運行狀態
>每天凌晨需要對過去的一天業務數據進行統計
>每個星期需要把日誌文件備份(如果日誌信息太多那麼佔用的磁盤空間就會越大,而且日誌我們大多都是實時分析一週之內的日誌信息,而超出一週的日誌我們會將它進行備份)每天凌晨兩三點鐘進行備份
>每個月需要把數據庫進行備份
>一般寫腳本,然後計劃任務執行
單一計劃任務
[root@localhost ~]# at now + 2 min ##at+時間,即任務執行的時間
at> wall hello,csdn! ##任務執行的內容,wall,廣播播報,大喇叭告訴所有人。
at> <EOT> ##ctrl+d 退出
job 4 at Sat May 9 08:57:00 2020 ## 在兩分鐘後有一個任務將執行
2min後
[root@localhost ~]#
Broadcast message from [email protected] (Sat May 9 08:57:00 2020):
hello,csdn! ##任務執行時間於規定時間相同
查看計劃任務
#atq (注意 當你這個計劃任務執行後再次查看就沒有顯示了)
[root@localhost ~]# atq
6 Sat May 9 09:20:00 2020 a root
#ll /var/spool/at 當計劃任務沒有執行會在該目錄下產生一個普通文件,但是執行後該位置的文件也就不在了
在/var/spool/at 可以查看當前的at任務。
[root@localhost at]# ll
total 4
-rwx------. 1 root root 3746 May 9 09:10 a00005019419a8
drwx------. 2 root root 6 May 9 08:57 spool
刪除任務:atrm
[root@localhost ~]# at now + 2min
at> wall haha!
at> <EOT>
job 7 at Sat May 9 09:21:00 2020
[root@localhost ~]# atq
7 Sat May 9 09:21:00 2020 a root
[root@localhost ~]# atrm 7 ##刪除的是計劃任務的編號
[root@localhost ~]#
[root@localhost ~]# atq
[root@localhost ~]#
週期計劃任務
yim install crond
格式說明:
* * * * * 分 時 日 月 周(五個*號的作用)
0-59 0-23 1-31 1-12 0-6
minute: 表示分鐘,可以是從0到59之間的任何整數。*/1
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這裏的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件。
在以上各個字段中,還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同 時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執行一次。
[root@localhost ~]# crontab -e -u root ##-e,添加cron表,-u,加用戶
crontab: installing new crontab
[root@localhost ~]#
[root@localhost ~]# crontab -l ##查看cron表
46 09 * * 06 wall haha
[root@localhost ~]# cat /var/spool/cron/root ##查看某用戶的cron表內容
46 09 * * 06 wall haha
[root@localhost ~]#
[root@localhost ~]#到達指定時間
Broadcast message from [email protected] (Sat May 9 09:46:01 2020):
haha
[root@localhost ~]# crontab -e -u root ##創建多個計劃任務
crontab: installing new crontab
[root@localhost ~]# crontab -l ##查看計劃任務-l
46 09 * * 06 wall haha
* 12 * * * wall hehe
* * * * * wall xixi
[root@localhost ~]# cd /var/spool/cron/ 計劃任務不會執行一次而消失的原因,會生成一個文件,文件執行後不會移出,所以當到達指定時間時候,會繼續執行。鬧鐘也一樣,可以設定每個週週內早上6點叫你起牀,而週末就不設定鬧鐘一樣。
[root@localhost cron]# ll ##設定不同的用戶就有不同用戶的計劃任務文件
total 8
-rw-------. 1 root root 26 May 9 09:47 redhat
-rw-------. 1 root root 78 May 9 09:56 root
[root@localhost cron]# cat root
46 09 * * 06 wall haha
* 12 * * * wall hehe
* * * * * wall xixi
[root@localhost cron]# 每分鐘的xixi廣播
Broadcast message from [email protected] (Sat May 9 09:57:01 2020):
xixi
[root@localhost cron]# crontab -l
46 09 * * 06 wall haha
* 12 * * * wall hehe
* * * * * wall xixi
[root@localhost cron]# crontab -r 計劃任務刪除,全刪,也可以通過crontab,刪除某一條內容。
[root@localhost cron]# crontab -l
no crontab for root
[root@localhost cron]#
計劃任務的允許和拒絕列表
默認先查看允許列表,通過不看拒絕列表(系統中沒有允許列表,需要自己創建)
[root@localhost cron]# vim /etc/at.deny ##編輯拒絕列表,拒絕用戶redhat
[root@localhost cron]# cat /etc/at.deny
redhat
[root@localhost cron]# su - redhat ##切換到redhat用戶進行測試
Last login: Mon Apr 13 23:46:54 CST 2020 on :0
[redhat@localhost ~]$ at now + 1min
You do not have permission to use at. ##測試顯示沒有權限
[redhat@localhost ~]$ su - root
Password:
Last login: Sat May 9 08:45:28 CST 2020 from gateway on pts/1
[root@localhost ~]# vim /etc/at.allow ##添加允許列表,允許redhat用戶
##在系統中並沒有at.allow這個文件但只要你編輯這個文件再次允許你這個用戶
可以編寫計劃任務也是可以的。系統默認先是看你允許的
[root@localhost ~]# cat /etc/at.allow
redhat
[root@localhost ~]# su - redhat ##切換用戶進行測試
Last login: Sat May 9 10:13:19 CST 2020 on pts/1
[redhat@localhost ~]$ at now + 1min ##測試可以
at> wall haha
at> <EOT>
job 8 at Sat May 9 10:19:00 2020
crontab -e 和 vim /etc/crontab的區別
crontab -e 是當前用戶自定義的,只針對當前用戶生效,
/etc/crontab 是針對系統所有用戶生效的
[root@localhost ~]# vim /etc/crontab
SHELL=/bin/bash #運行計劃所使用的shell 默認是bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin #指定命令執行環境變量路徑
MAILTO=root #MAILTO變量指定了crond的任務執行信息將通過電子郵件發送給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
28 10 * * * wall csdn
注:當我們需要在同一時間執行的個腳本時候避免多次寫可以用 run-parts來執行
run-parts: 是一個腳本在/usr/bin/run-parts 作用就是執行一個目錄下的所有腳本/程序 ~
拓展計劃任務
假設當你的計劃任務應該在某個時間點執行,但由於一些因素(斷電)沒有執行那麼這個計劃任務還執不執行,什麼時候執行?
會在開機以後會開機檢查 計劃任務哪些執行哪些沒有執行,然後在指定時間內去執行
# vim /etc/anacrontab
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
(每一天開機以後5分鐘去檢查cron.daily這個腳本)