linux定时任务crontab详解
image.png
访问控制
- 白名单 若存在
/etc/cron.allow
,只有该文件内的用户才能使用crontab - 黑名单 若存在
/etc/deny
,该文件内的用户不能使用crontab - 优先级
/etc/cron.allow
>/etc/cron.deny
常用选项
- -e: 编辑任务
- -l: 显示所有任务
- -r: 删除当前用户的所有crontab任务
服务管理
$ systemctl status crond # 查看服务状态
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-02-18 01:32:37 CST; 13h ago
Main PID: 1598 (crond)
CGroup: /system.slice/crond.service
└─1598 /usr/sbin/crond -n
$ sudo systemctl start crond # 启动服务
$ sudo systemctl stop crond # 停止服务
根据cron的日志实时查看执行情况
$ sudo tail -f /var/log/cron
时间选项说明
五个*号
crontab 由 五个 * 定义任务的执行时间,具体含义为:
*号 |
含义 |
范围 |
---|---|---|
第1个 |
1小时中的第几分钟 |
0-59 |
第2个 |
1天中的第几小时 |
0-23 |
第3个 |
1个月中的第几天 |
1-31 |
第4个 |
1年中的第几月 |
1-12 |
第5个 |
1周中的星期几 |
0-7(0和7都代表星期日) |
特殊符号
-
- 表示任何时间,如第1个 * 表示1小时中的每分钟都执行一次
- , 表示不连续时间,如
0 8,12,16 * * *
表示每天的8点0分,12点0分,16点0分执行一次命令 -
- 表示连续的时间范围,如
0 5 * * 1-6
,表示周一至周六的凌晨5点0分执行命令
- 表示连续的时间范围,如
具体示例
45 22 * * *
22点45分执行0 17 * * 1
每周一的17点0分执行0 5 1,15 * *
每月1号和15号的凌晨5点0分执行40 4 * * 1-5
每周一至周五的凌晨4点40分执行
注意:星期几与几号不要同时出现
0 0 1,15 * 1
表示的是:每月1号和15号的0点0分执行,每周一的0点0分执行。两者是或的关系,但不要有这种写法,很容易产生歧义
系统的定时任务
crontab -e
表示每个用户以自己的身份执行自己的定时任务。除此之外,还可以通过/etc/crontab
这个配置文件指定任务
用系统配置的方式执行定时任务,有两种方式:
- 第一种:将需要定时执行的脚本放到 `/etc/cron.{daily,weekly,monthly}/目录中
$ ls /etc | grep cron
anacrontab
cron.d
cron.daily
cron.deny
cron.hourly
cron.monthly
crontab
cron.weekly
$ sudo cat /etc/anacrontab # 用于管理
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#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
- 第二种:修改
/etc/crontab
配置文件
$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 由此可知,crontab是有自己的环境变量的,因此在crontab中要用绝对路径,shell中的PATH与crontab的PATH不一定相同
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
实际应用中,一般直接使用
crontab -e
的方式来处理更加常见