在日常工作中,经常会用到定时任务配合脚本自动处理一些重复性工作,通常我会选择 crontab & flock & script 这样的组合进行配置, 最近了解了 systemd timer ,发现虽然配置上比 crontab 要麻烦一点(需要编写两个配置文件), 但是其他的优势是 crontab 不具备的。
systemd timer 优势 链接到标题
- systemd 会自动将定时任务事件记录在 systemd 日志中,可以通过 journalctl 轻松查找
- 可以配置定时器之间的依赖关系
- 定时器启动/关闭不需要再注释掉 crontab 中的某一行或移除
/etc/cron.d/
下的某个文件,而是直接 start/stop/enable/disable 控制 - 自带锁机制,无需通过 flock 或脚本中添加锁文件的方式控制任务执行与否
使用方式 链接到标题
例如,我想要定时备份数据从开发机到服务器上,通常重要的文件采用 inotify & rsync 的方式同步,优先级较低的采用定时同步方式。
crontab 配置方式 链接到标题
编写 crontab 配置文件 链接到标题
crontab -e (或者在 /etc/cron.*/ 对应路径下编写配置文件)
0 1 * * * flock /usr/local/bin/system-backup.sh
手动触发定时任务 链接到标题
/usr/local/bin/system-backup.sh
systemd timer 配置方式 链接到标题
编写 timer 配置文件 链接到标题
[Unit]
Description=Perform system backup
[Timer]
OnCalendar=daily
[Install]
WantedBy=timers.target
编写 timer 对应 service 配置文件 链接到标题
[Unit]
Description=Perform system backup
[Service]
Type=simple
Nice=19
IOSchedulingClass=2
IOSchedulingPriority=7
ExecStart=/usr/loca/bin/system-backup.sh
启动定时任务 链接到标题
systemctl start system-backup.timer
systemctl enable system-backup.timer
检查定时任务是否启动 链接到标题
systemctl list-timers --all
手动触发定时任务 链接到标题
systemctl start system-backup.service
查看日志 链接到标题
可以通过 journalctl 查看定时任务日志,并且可以指定过滤条件。
journalctl -u system-backup --since="yesterday"