Linux定时任务概述
基于centos7.6.1810
参考鸟哥私房菜
/etc/crontab
[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这个命令
-
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用户也会“哈哈”