crontab 是 Linux 系统自带的定时执行工具,可以在无需人工干预的情况下运行作业。crontab 通过 crond 进程来提供服务,crond 进程每分钟会定期检查是否有要执行的任务,如果有,则自动执行该任务。crond 进程通过读取 crontab 配置,来判断是否有任务执行,以及何时执行。
crond 进程会在下面这 3 个位置查找 crontab 配置文件。
可以看到,如果想执行一个 crontab 任务,就需要确保 crond 运行,并配置 crontab 任务。具体分为以下两步:
$ systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2021-11-17 07:11:27 CST; 2 days ago Main PID: 9182 (crond) Tasks: 1 Memory: 728.0K CGroup: /system.slice/crond.service └─9182 /usr/sbin/crond -n
Active: active(running)说明crond进程正在运行,否则可以执行systemctl start crond启动crond进程。
可以通过crontab -e
来编辑配置文件,例如执行crontab -e
后进入vi交互界面,并配置以下crontab任务:
# 每分钟输出时间到文件 /tmp/test.txt * * * * * echo `date` >> /tmp/text.txt # 每隔2分钟同步一次互联网时间 */2 * * * * /usr/bin/ntpstat time.windows.com > /dev/null 2>&1
编辑后的配置文件保存在/var/spool/cron/$USER文件中。你可以通过crontab -l或者sudo cat /var/spool/cron/$USER来查看,例如:
$ crontab -l # 每分钟输出时间到文件 /tmp/test.txt * * * * * echo `date` >> /tmp/text.txt # 每隔2分钟同步一次互联网时间 */2 * * * * /usr/bin/ntpstat time.windows.com > /dev/null 2>&1
如果想删除所有的crontab任务,你可以执行crontab -r命令。
配置crontab任务需要遵循crontab的时间格式,格式如下:
.---------------- 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 | | | | | * * * * * <command to be executed>
可以看到,crontab只能精确到分钟,不能精确到秒。
下面是一些常用的crontab时间格式,你可以参考,来加深理解:
# 每分钟执行一次 <command> * * * * * <command> # * 代表所有可能的值 # 每隔一小时执行一次 <command> * */1 * * * <command> # / 表示频率 # 每小时的 15 和 30 分各执行一次 <command> 15,45 * * * * <command> # , 表示并列 # 在每天上午 8- 11 时中间每小时 15,45 分各执行一次 <command> 15,45 8-11 * * * <command> # - 表示范围 # 每个星期一的上午 8 点到 11 点的第 3 和第 15 分钟执行一次 <command> 3,15 8-11 * * 1 <command> # 每隔两天的上午 8 点到 11 点的第 3 和第 15 分钟执行一次 <command> 3,15 8-11 */2 * * <command>
使用crontab执行周期/定时任务的优点是不用做任何开发,只需要配置crontab任务即可。至于缺点也很明显,主要有下面几个: