0%

使用crontab运行简单的定时任务

前段时间遇到一个需要在本地开发环境定时执行某个脚本来同步数据的情景。

如果是线上业务的话,我一般会使用Celery Beat来执行定时任务。考虑到运行Celery Beat需要启动两个服务(celery workercelery beat),还要管理虚拟环境并编写 Python 代码,用在简单的定时任务执行场景过于复杂。

说起定时任务,首先想到的就是crontab。于是我调研了一下crontab的使用方法,成功配置了定时任务,也在这里简单的介绍一下。

crontab 简介

crontab(守护进程为crond)是类 unix 平台下的一个定时任务管理工具,可用于周期性执行定时任务。

crontab的任务通过cron table格式配置。

cron table 格式

1
2
3
4
5
6
7
8
9
10
11
*    *    *   *    *  Command_to_execute
| | | | |
| | | | Day of the Week ( 0 - 6 ) ( Sunday = 0 )
| | | |
| | | Month ( 1 - 12 )
| | |
| | Day of Month ( 1 - 31 )
| |
| Hour ( 0 - 23 )
|
Min ( 0 - 59 )
  • 使用’*‘匹配任意值,例如:每天零点执行0 0 * * *
  • 使用’,’表示一系列值,例如:每个周末零点执行0 0 * * 0,6
  • 使用’-‘表示范围,例如:工作日中午执行0 12 * * 1-5
  • 使用’/‘表示在指定数值是特定值的整数倍时执行,例如:每五分钟执行*/5 * * * *

启动cron服务

我的开发环境操作系统(Ubuntu 20.04)默认是不启动cron服务的,需要手动开启。

1
2
➜  ~ sudo service cron start
* Starting periodic command scheduler cron [ OK ]

也可以配置cron服务为开机启动。

1
2
3
➜  ~ sudo systemctl enable cron
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable cron

配置crontab任务

可以通过crontab -e命令配置当前用户的定时任务,执行后会打开默认编辑器,我们可以编写一个简单的定时任务(每分钟输出当前时间追加到/tmp/time.txt)。

1
* * * * * echo `date` >> /tmp/time.txt

保存定时任务配置后crontab会输出相关信息。

1
2
3
➜ ~ crontab -e
no crontab for yixian - using an empty one
crontab: installing new crontab

一段时间后就可以看到/tmp/time.txt文件会定时更新。

1
2
3
4
5
6
➜  ~ tail -f /tmp/time.txt
2021年 04月 06日 星期二 22:46:01 CST
2021年 04月 06日 星期二 22:47:01 CST
2021年 04月 06日 星期二 22:48:01 CST
2021年 04月 06日 星期二 22:49:01 CST

查看crontab执行日志

crontab的日志记录在/var/log/cron.log,不过 Ubuntu 默认不开启crontab的日志选项,需要编辑/etc/rsyslog.d/50-default.conf文件,取消cron行的注释,并重启rsyslog(sudo service rsyslog restart)。

稍后就可以查看crontab的日志。

1
2
3
4
➜  ~ tail /var/log/cron.log
Apr 6 22:56:01 Duyixian-PC CRON[22749]: (yixian) CMD (echo `date` >> /tmp/time.txt)
Apr 6 22:57:01 Duyixian-PC CRON[22752]: (yixian) CMD (echo `date` >> /tmp/time.txt)
Apr 6 22:58:01 Duyixian-PC CRON[22755]: (yixian) CMD (echo `date` >> /tmp/time.txt)

其他crontab命令

  • 查看当前用户定时任务配置:crontab -l
  • 取消所有当前用户定时任务:crontab -r
  • 使用-u选项编辑或查看其他用户配置cron -u username -l [-e]

总结

诸如crontab这样的 Linux 常用工具可以极大地提高日常工作的效率,值得多多学习了解。

扫码加入技术交流群🖱️
QR code