文中部分內容摘自駿馬金龍的博客,查看可 "點擊" 1. crontab簡述 crontab命令用於周期性的執行任務,想要執行這個命令,需要首先啟動crond(守護進程)服務才行 crontab是配置管理crontab file的功程式,也可以移除或列出用於為 cron 提供服務的現有表項 cront ...
文中部分內容摘自駿馬金龍的博客,查看可點擊
1. crontab簡述
- crontab命令用於周期性的執行任務,想要執行這個命令,需要首先啟動crond(守護進程)服務才行
- crontab是配置管理crontab file的功程式,也可以移除或列出用於為 cron 提供服務的現有表項
- crontab file存在於多處,包括系統定時任務文件/etc/crontab和/etc/cron.d/*,還有獨屬於各用戶的任務文件/var/spool/cron/USERNAME
cron的守護進程(daemon)
Centos7可以使用以下方式查看,Centos6可以使用:service crond status
看到enable和running即可
[root@Centos7 ~]# systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-09-05 15:14:24 CST; 1h 9min ago
Main PID: 1437 (crond)
CGroup: /system.slice/crond.service
└─1437 /usr/sbin/crond -n
Sep 05 15:14:24 Centos7.4 systemd[1]: Started Command Scheduler.
Sep 05 15:14:24 Centos7.4 systemd[1]: Starting Command Scheduler...
Sep 05 15:14:24 Centos7.4 crond[1437]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 80% if used.)
Sep 05 15:14:25 Centos7.4 crond[1437]: (CRON) INFO (running with inotify support)
運行進程與設置開機自啟
Centos7
[root@Centos7 ~]# systemctl start crond.service
[root@Centos7 ~]# systemctl enable crond.service
Centos6
[root@Centos7 ~]# service crond start
[root@Centos7 ~]# chkconfig --livel 3 crond on
2. crontable file
crondtab file為任務定義文件
- 在此文件中,空行會被忽略,首個非空白字元且以#開頭的行為註釋行,但#不能出現在行中。
- 可以在crontab file中設置環境變數,方式為"name=value",等號兩邊的空格可隨意,即"name = value"也是允許的。但value中出現的空格必須使用引號包圍。
- 預設crond命令啟動的時候會初始化所有變數,除了某幾個變數會被crond daemon自動設置好,其他所有變數都被設置為空值。自動設置的變數包括SHELL=/bin/sh,以及HOME和LOGNAME(在CentOS上則稱為USER),後兩者將被預設設置為/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定義的變數覆蓋,但LOGNAME不允許覆蓋。當然,自行定義的變數也會被載入到記憶體。
- 除了LOGNAME/HOME/SHELL變數之外,如果設置了發送郵件,則crond還會尋找MAILTO變數。如果設置了MAILTO,則郵件將發送給此變數指定的地址,如果MAILTO定義的值為空(MAILTO=""),將不發送郵件,其他所有情況郵件都會發送給crontab file的所有者。
- 在系統定時任務文件/etc/crontab中,預設已定義PATH環境變數和SHELL環境變數,其中PATH=/sbin:/bin:/usr/sbin:/usr/bin。
- crond daemon每分鐘檢測一次crontab file看是否有任務計劃條目需要執行。
2.1 cron任務分兩類
- 系統cron任務:主要用於實現系統自身的維護
- 只能手動編輯/etc/crontab文件,不能使用crontab命令
- 用戶cron任務:
- 可以通過編輯/var/spool/cron/USERNAME文件
- 也可以通過命令crontab -e來進行,此種方式帶語法檢查功能,推薦此種方式
2.2 系統cron的配置格式:/etc/crontab
[root@Centos7 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin ##cron任務只能識別這幾個路徑下的命令,如果命令不在這幾個目錄中,就會找不到命令,所以建議使用全路徑
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
這個文件中包含如下信息:
1. SHELL:周期執行任務用的shell
2. PATH:命令路徑
3. MAILTO:執行結果發送給哪個用戶
4. * * * * * 分別表示:分、時、日、月、周
5. username:執行命令的用戶(用戶cron任務沒有)
6. command to be executed:周期執行的任務/命令,在預設情況下命令會根據/etc/crontab中指定的PATH路徑進行查找,所以建議使用全路徑
2.3 時間表示法
(1)特定值:
給定時間點有效取值範圍內的值;
Note:day of week 和 day of month一般不同時使用
Note:如果定義的日和周衝突了,則會多次執行(不包括因為*號導致的衝突)。例如每月的15號執行該任務,同時又定義了周三執行該任務,正常無衝突情況下,將在周三和每月15號執行,但如果某月的15號同時是周三,則該任務在此日執行兩次。因此,應該儘力避免同時定義周和日的任務
(2) *
給定時間點上有效取值範圍內的所有值;表示每...(每分鐘0-59、每小時0-24、每天1-29/30/31、每月1-12、每周0-6)
(3)離散取值:,
在時間點上使用逗號分隔的多個值
#,#,#
(4)連續取值:-
在時間點上使用“ - ”連接開頭和結束
#-#
(5)在指定時間點上,定義步長
/#:#即步長
Note:
(1)指定的時間點不能被步長整除時,其意義將不復存在
(2)最小時間單位為“分鐘”,想完成“秒”級人物,需要額外藉助於其他機制
定義成每分鐘任務:再利用腳本實現在每分鐘內,迴圈多次
另外一個需要註意的時間段設置是,使用*號導致低級別的時間覆蓋高級別的時間。例如"* */2 * * *",它不表示每兩小時執行一次任務,而是每分鐘執行一次,儘管在小時位上設置了每隔兩小時,但在分鐘位上設置的是每分鐘,所以它仍然表示每分鐘執行一次任務。同理,"*/5 */2 * * *"分鐘位上的設置覆蓋小時位上的設置,表示每5分鐘執行一次而忽略小時位的設置;"00 */2 */5 * *"表示每隔兩小時的整點執行一次任務而忽略天數位的設置
實例
3 * * * * 每小時的第3分鐘執行一次
3 4 * * * 每周五的04:03執行一次
5 6 7 * * 每月7號的06:05執行一次
7 8 9 10 * 每年10月9日的08:07執行一次
9 8 * * 3,7 每周三和周日的08:09執行一次
00 8,20 * * 3,7 每周三和周日的8:00和20:00執行一次
0 9-18 * * 1-5 工作日的工作時間
*/2 * * * * 每2分鐘執行一次
*/7 * * * * 每7分鐘執行一次(60除7除不開,所以最後一次是間隔4分鐘就執行了,然後下麵一小時重新執行)
*/30 * * * * 每半小時執行一次
00 */2 * * * 沒兩個小時的整點執行一次
3. crontab命令使用
NAME
crontab - maintains crontab files for individual users
SYNOPSIS
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
OPTIONS
-e 編輯任務
-l 列出當前用戶的crontab任務都有什麼
-r 移除所有任務,即刪除/var/spool/cron/USERNAME文件(推薦使用#進行註釋,或者直接刪除相應條目)
-i 在使用-r選項移除所有任務時提示用戶確認
-u 指定編輯哪個用戶的crontab
Note:運行結果以郵件通知給當前用戶;如果拒絕接受郵件可以:
1. COMMAND > /dev/null ##將正確的執行結果發送給null
2. COMMAND &> /dev/null ##將正確與錯誤的執行結果發送給null
Note:定義COMMAND時,如果命令需要用到%,需要對其轉義;因為直接使用%表示換行的特殊意義,且第一個%後的所有字元串將當作命令的標準輸入。
思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
不會執行,只能等待下一個時間節點
如果期望某時間因故未能按時執行,下次開機後無論是否到了響應時間點都要執行一次,可使用anacron實現
EXAMPLES
1、每12小時備份一次/etc目錄至/backup目錄中,保存文件 名稱格式為“etc-yyyy-mm-dd-hh-MM-SS.tar.gz”
00 */12 * * * /bin/tar -zcf /backup/etc-$(date "+\%F-\%H-\%M-\%S").tar.gz /etc
2、每周2、4、7備份/var/log/secure文件至/logs目錄中,文件名格式為“secure-yyyymmdd.tar.gz”;
* * * * 2,4,7 /bin/tar -zcf /log/secure-$(date +\%F).tar.gz /var/log/secure
3、每年9月份的10號到24號這段時間,每2小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息,追加至/tmp/meminfo.txt文件中
00 */2 9-24 10 * /bin/egrep "^(S|M)" /proc/meminfo >> /tmp/meminfo.txt 2>/dev/null
4. crontab執行不成功的排查方式
1、查看crontab的日誌文件/var/log/cron
[Allen@Centos7 ~]$ sudo tail -f /var/log/cron
Sep 6 09:14:01 Centos7 CROND[24490]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:15:01 Centos7 CROND[24510]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:15:01 Centos7 CROND[24511]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep 6 09:16:01 Centos7 CROND[24535]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:17:01 Centos7 CROND[24552]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:18:01 Centos7 CROND[24569]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:19:01 Centos7 CROND[24586]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:20:01 Centos7 CROND[24605]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
Sep 6 09:20:01 Centos7 CROND[24606]: (Allen) CMD (/usr/sbin/ntpdate -u ntp.aliyun.com >/dev/null 2>&1)
Sep 6 09:21:01 Centos7 CROND[24670]: (root) CMD (/bin/tar -zcf /backup/etc-"$(date "+%F-%H-%M-%S")".tar.gz /etc &> /dev/null)
2、使用crond命令的調試
參考駿馬金龍博客