crontab命令常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。
crontab文件包含送交cron守護進程的一系列作業和指令。每個用戶可以擁有自己的crontab文件。
同時,操作系統保存一個針對整個系統的crontab文件 /etc/crontab,這個文件只有管理員用戶有權限修改。
cronie:主程序包,提供crond守護進程及相關輔助工具。
# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/var/spool/cron
crontabs:系統自帶的一些計划任務。
# rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/etc/sysconfig/run-parts
/usr/bin/run-parts
cronie-anacron:cronie的補充程序,用於監控cronie任務的執行狀況。
# rpm -ql cronie-anacron
/etc/anacrontab
/etc/cron.hourly/0anacron
/usr/sbin/anacron
/var/spool/anacron
/var/spool/anacron/cron.daily
/var/spool/anacron/cron.monthly
/var/spool/anacron/cron.weekly
anacrontab 負責執行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 中的系統任務。
當任務執行時,更新/var/spool/anacron/中文件的時間戳。
anacron的配置與cron類似,也有一個類似的配置文件 /etc/anacrontab,其配置格式可以通過man anacrontab查看。
# vim /etc/anacrontab
@reboot : Run once after reboot.
@yearly : Run once a year, ie. "0 0 1 1 *".
@annually : Run once a year, ie. "0 0 1 1 *".
@monthly : Run once a month, ie. "0 0 1 * *".
@weekly : Run once a week, ie. "0 0 * * 0".
@daily : Run once a day, ie. "0 0 * * *".
@hourly : Run once an hour, ie. "0 * * * *".
crontab在 /etc 目錄下面存在 cron.d、cron.daily、cron.weekly、cron.monthly、cron.hourly 五個目錄和 crontab、cron.deny 二個文件。
cron.daily 是每天執行一次的job
cron.weekly 是每個星期執行一次的job
cron.monthly 是每月執行一次的job
cron.hourly 是每個小時執行一次的job
cron.d 是系統自動定期需要執行的任務,如果不是按小時,按天,按星期,按月來執行的,那么就放在這個目錄下面。
如果是按小時,按天,按星期,按月的來執行的話,則可以放到前面相應的目錄下面去。
在/var/spool下面存在着兩個目錄cron,anacron。
/var/spool/cron 目錄下面是每個用戶自己通過 crontab -e 增加的crontab的內容。
/var/spool/anacron 目錄下面是記錄的是cron.daily,cron.monthly,cron.weekly上一次執行的時間。
crond服務每隔一分鍾去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d 下面的所有內容,以實現任務的執行。
crontab的權限控制
/etc/cron.allow 和 /etc/cron.deny 文件被用來限制對 cron 的使用。
這兩個控制文件的格式都是每行一個用戶。兩個文件都不允許有空格。
如果控制文件被修改了,cron守護進程 crond 不必重啟。控制文件在每次用戶添加或刪除一項 cron 任務時都會被讀取。
/etc/cron.allow 的優先級高於 /etc/cron.deny。
如果 cron.allow 文件存在,只有其中列出的用戶才被允許使用 cron,並且cron.deny 文件會被忽略。
如果 cron.allow 文件不存在,所有在cron.deny 中列出的用戶都被禁止使用 cron。
crontab命令
crontab [-u user] [-l | -r | -e] [-i]
-l:列出當前用戶的計划任務。
-e:編輯當前用戶的計划任務。
-r:刪除當前用戶的所有計划任務。即刪除/var/spool/cron/USERNAME文件。
-u:管理指定用戶的計划任務,僅root有權限。
-i:在使用-r選項刪除所有任務時提示用戶確認。
crontab的語法
crontab分為兩類,系統crontab 和 用戶crontab。
1、系統cron任務
系統的crontab存放在 /etc/crontab
# vim /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
a、每一行定義一個周期性任務,共7個字段。
b、此處的環境變量不同於用戶登錄后獲得的環境,因此建議命令使用絕對路徑。
c、執行結果會發送郵件給mailto指定的用戶。
2、用戶cron任務
用戶的crontab文件存放在 /var/spool/cron/USERNAME
# crontab -e -u USERNAME
a、每一行定義一個周期性任務,共6個字段。
b、此處的環境變量不同於用戶登錄后獲得的環境,因此建議命令使用絕對路徑。
c、執行結果會發送郵件給當前用戶。
星號(*)匹配所有有效的值。
短橫線(-)表示范圍連續取值。
逗號(,)表示離散取值。
正斜線(/)指定間隔頻率。例如,0-59/2 在分鍾字段表示每兩分鍾。
指定的時間點不能被步長整除時,其意義將不存在。例如 */7 * * * *
注意:%在crontab中被認為是newline,使用時需要用 \ 轉義。比如crontab文件中,如果有 "date +%Y%m%d",必須替換為:"date +\%Y\%m\%d"。

crontab的最小時間單位為”分鍾“,想完成”秒“級任務,得需要借助於其它方式。
先定義為每分鍾任務,再利用腳本實現在每分鍾之內,循環執行多次。
sleep命令
delay for a specified amount of time.
s: 秒,默認單位
m: 分
h: 小時
d: 天
usleep命令
sleep some number of microseconds.The default is 1.
# usleep 1000000 休眠1秒
示例
*/5 * * * * 每5分鍾執行一次
3 * * * * 每小時的第3分鍾執行一次
3 4 * * 5 每周5的4點3分執行一次
5 6 7 * * 每月的7號的6點5分執行一次
7 8 9 10 * 每年的10月9號8點7分執行一次
9 8 * * 3,7 每周3和周日的8點9分
0 8,20 * * 3,7 每周3和周日的8點和20點執行一次
0 9-18 * * 1-5 周一到周五的9-18點,即工作時間內的每小時
0 7 25 12 * 每年的12月25號7點執行一次
查看所有用戶的crontab
for u in `cat /etc/passwd | cut -d":" -f1`;do crontab -l -u $u;done
查看cron的日志
tail -50f /var/log/cron
參考:
