基于centos7.6.1810
参考鸟哥私房菜
[root@VM-4-10-centos ~]# 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
可以看到/etc/crontab说明了一个定时任务的定义模板
7个字段,前面5位是时间字段,第六位是用吗,第七位是待执行的命令
时间说明
第N位 | 单位 | 范围 | 说明 |
---|---|---|---|
第一位 | 分钟 | 0-59 | |
第二位 | 小时 | 0-23 | |
第三位 | 几号 | 1-31 | |
第四位 | 哪一月 | 1-12 | 可以是jan,feb,mar,apr等英文缩写 |
第五位 | 周几 | 0-7 | 周日是0或7,也可以是sun,mon,tue等英文缩写 |
每一位上均可以是特殊字符,比如
特殊字符 | |
---|---|
* | 代表任何时刻都接受的意思 |
, | 代表分隔时段的意思 |
- | 代表一段时间范围内 |
/n | 每隔 n 单位间隔 |
示例
30 21 * * 1,3,5,7 umount /media
# 每周一、周三、周五、周日的晚上9点半执行umount /media
* 8-23/2 * 1-5 * /apps/bin/dbcheck.sh
# 每年的1到5月早上8点到23点间每隔2个小时(8:00-10:00-12:00这样)执行数据库检查脚本
0 0 * * 2-6 /apps/bin/dbcheck.sh
# 周二到周六早上0点执行数据库检查脚本
45 4-8 1,10,22 * * exp scott/tiger dbfile=1.bak
# 每个月的1号、10号、22号的早上4点到8点的45分(4:45-5:45) 执行后续命令
10 1 * * 6,0 /usr/local/alert/file_check.sh
# 每个周末的凌晨1点10分执行文件检查脚本
59 23 28 2-5,7,9 * /usr/local/alert/file_check.sh
# 每年的2、3、4、5、7、9月的28日晚上23点59分执行文件检查脚本
注意这样写的含义
* 1-23 * * * # 每天的1:00 1:01 1:02 ... 都会去...
0 1-23 * * * # 每天的1:00 2:00 3:00 ... 都会去 ...
知道了如何去定义一个定时任务
你还需要知道如何去编辑查看删除定时任务等,你会用到crontab这个命令
crontab命令常见参数
-e #edit 编辑,进入vi模式了,写完保存退出即可
-l #list 列出所有定时任务
-r #remove 删除指定的定时任务
一行一个定时任务
/etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab
/etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使 用者,就可以使用 crontab
以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断 上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可。系统默认是保留 /etc/cron.deny
一个账号一行
cron定时任务的执行还依赖于crond进程,你可以用systemctl来管理它
[root@VM-4-10-centos home]# ps -ef|grep crond
root 9612 1 0 13:37 ? 00:00:00 /usr/sbin/crond -n
[root@VM-4-10-centos home]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-02-28 13:37:26 CST; 9min ago
Main PID: 9612 (crond)
Tasks: 1
Memory: 620.0K
CGroup: /system.slice/crond.service
└─9612 /usr/sbin/crond -n
仔细的同学会发现如果我设置的几月几日,且设置了周几,那到底以哪个为准呢?
1 2 3 4 5 root echo haha # 每年的4月3日 一定是周五?
man 5 crontab往下翻一点,你能找到这段话
Note: The day of a command's execution can be specified in the following two fields — 'day of month', and 'day of week'. If both fields are restricted (i.e., do not contain the "*" character), the command will be run when either field matches the current time. For example,
"30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
前面的5个时间字段,其实分为2个部分,前面4个是一部分,后面周几是另外一部分。
这是or的关系,意味着满足一个就会去执行,所以
1 2 3 4 5 root echo haha
# 这个命令的意思是每周五的凌晨2点1分,root用户“哈哈”,
# 以及每年的4月3日凌晨2点1分root用户也会“哈哈”