前段时间遇到一个需要在本地开发环境定时执行某个脚本来同步数据的情景。
如果是线上业务的话,我一般会使用Celery Beat
来执行定时任务。考虑到运行Celery Beat
需要启动两个服务(celery worker
和celery beat
),还要管理虚拟环境并编写 Python 代码,用在简单的定时任务执行场景过于复杂。
说起定时任务,首先想到的就是crontab
。于是我调研了一下crontab
的使用方法,成功配置了定时任务,也在这里简单的介绍一下。
crontab 简介
crontab
(守护进程为crond
)是类 unix 平台下的一个定时任务管理工具,可用于周期性执行定时任务。
crontab
的任务通过cron table
格式配置。
cron table 格式
1 | * * * * * Command_to_execute |
- 使用’*‘匹配任意值,例如:每天零点执行
0 0 * * *
- 使用’,’表示一系列值,例如:每个周末零点执行
0 0 * * 0,6
- 使用’-‘表示范围,例如:工作日中午执行
0 12 * * 1-5
- 使用’/‘表示在指定数值是特定值的整数倍时执行,例如:每五分钟执行
*/5 * * * *
启动cron
服务
我的开发环境操作系统(Ubuntu 20.04)默认是不启动cron
服务的,需要手动开启。
1 | ➜ ~ sudo service cron start |
也可以配置cron
服务为开机启动。
1 | ➜ ~ sudo systemctl enable cron |
配置crontab
任务
可以通过crontab -e
命令配置当前用户的定时任务,执行后会打开默认编辑器,我们可以编写一个简单的定时任务(每分钟输出当前时间追加到/tmp/time.txt
)。
1 | * * * * * echo `date` >> /tmp/time.txt |
保存定时任务配置后crontab
会输出相关信息。
1 | ➜ ~ crontab -e |
一段时间后就可以看到/tmp/time.txt
文件会定时更新。
1 | ➜ ~ tail -f /tmp/time.txt |
查看crontab
执行日志
crontab
的日志记录在/var/log/cron.log
,不过 Ubuntu 默认不开启crontab
的日志选项,需要编辑/etc/rsyslog.d/50-default.conf
文件,取消cron
行的注释,并重启rsyslog
(sudo service rsyslog restart
)。
稍后就可以查看crontab
的日志。
1 | ➜ ~ tail /var/log/cron.log |
其他crontab
命令
- 查看当前用户定时任务配置:
crontab -l
- 取消所有当前用户定时任务:
crontab -r
- 使用
-u
选项编辑或查看其他用户配置cron -u username -l [-e]
总结
诸如crontab
这样的 Linux 常用工具可以极大地提高日常工作的效率,值得多多学习了解。