systemd 定时任务是一个单元配置文件,它在由 systemd 管理的 Linux 系统中安排任务。systemd 中的计时器类似于 cron 作业,但更强大和灵活,因为它们提供额外的功能并与其他 systemd 组件紧密集成。
为什么不使用 Cron Jobs
自 1975 年 5 月以来, cron系列调度实用程序一直是 Unix 和类 Unix 操作系统的一部分。在 1980 年代,作为 Richard Stallman 的新自由软件运动的一部分,创建了几个cron的免费语音版本。
后来 Paul Vixie 在 1987 年创建了自己的免费版本。Vixie 的版本成为 Linux 世界中使用最广泛的版本。
虽然 Linux cron 作业是一种广泛使用且有效的任务安排方式,但也有一些缺点:
如果您只是需要快速创建一个简单的作业,那么使用cron肯定没有错。但是,如果您需要设置一些更高级的东西,那么一定要使用systemd计时器。
Systemd Timer
使用systemd计时器,您将拥有更多的灵活性和准确性。您创建的与计时器一起使用的服务可以利用资源管理、安全性以及使用systemd带来的所有其他好处。
您可以创建在某些预定义事件上触发的计时器,或者您可以指定要触发计时器的时间的日历和时钟时间。作为额外的好处,systemd将在系统日志文件中记录计时器事件的完成。
典型的计时器单元文件如下所示:
[Unit]
Description=Run my-script every hour
[Timer]
OnCalendar=*-*-* *:00:00
Persistent=true
[Install]
WantedBy=timers.target
如您所见,systemd 计时器由两部分组成:
计时器单元文件定义任务何时运行,而服务单元文件定义任务做什么。在上面的示例中,部分OnCalendar中的指令[Timer]指定计时器的时间表(在本例中每小时运行一次)。Persistent当设置为 时,该指令true可确保如果计时器本应在系统停机期间运行,它将在系统备份后立即运行。
关联的服务单元文件可能如下所示:
[Unit]
Description =My hourly script
[Service]
Type = on eshot
ExecStart =/path/to/my-script.sh
ExecStart该部分中的指令指定[Service]触发计时器时要运行的命令。
要使用 systemd 计时器,您需要将计时器和服务单元文件放在适当的 systemd 配置目录(例如,/etc/systemd/system/)中,然后使用以下systemctl命令启用并启动计时器:
$ systemctl enable my-script.timer
$ systemctl start my-script.timer
日历字段
systemd 计时器单元文件中的字段OnCalendar用于定义计时器应何时触发相关服务。
该OnCalendar字段使用类似于以下内容的格式:
OnCalendar=[DayOfWeek] Year-Month-Day Hour:Minute:Second
格式的每个部分都是可选的,您可以使用通配符来指定重复模式。以下是一些示例来说明该领域的灵活性OnCalendar:
除了标准格式外,systemd 还支持几种速记符号:
OnCalendar您还可以在同一计时器单元中指定多个字段以定义更复杂的计划。例如:
OnCalendar=Mon,Fri *-*-* 12:00:00
OnCalendar=Wed *-*-* 14:00:00
系统计时器演示
假设我们要备份一个名为database/database/backup/目录的文件夹。
创建系统服务
首先,创建服务单元文件/etc/systemd/system/my-backup.service:
$ vim .config/backup.service
[Unit]
Description=Backup my DB directory
[Service]
Type=oneshot
ExecStart=/usr/bin/rsync -a /home/txu/database /database/backup
创建定时器单元
接下来,创建定时器单元文件/etc/systemd/system/my-backup.timer:
[Unit]
Description = Run My Daily Script at 3 : 00 AM
[Timer]
OnCalendar =*-*-* 03 : 00 : 00
Persistent = true
[Install]
WantedBy =timers.target
此文件指定计时器应在每天凌晨 3:00 运行。
重新加载systemd
$ systemctl daemon-reload
启用并启动定时器
$ systemctl enable my-backup.timer
Created symlink from /etc/systemd/system/timers.target.wants/my-backup.timer to /etc/systemd/system/my-backup.timer.
$ systemctl start my-backup.timer
查看定时器信息
$ systemctl status my-backup.timer
● my-backup.timer - Run My Daily Script at 3:00 AM
Loaded: loaded (/etc/systemd/system/my-backup.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Fri 2023-03-17 19:59:25 UTC; 16s ago
$ systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Sat 2023-03-18 03:00:00 UTC 6h left n/a n/a my-backup.timer my-backup.service
Sat 2023-03-18 16:10:28 UTC 20h left Fri 2023-03-17 16:10:28 UTC 3h 49min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
2 timers listed.
Pass --all to see loaded but inactive timers, too.
您可以使用以下命令查看所有计时器:
$ systemctl list-unit-files -t timer
UNIT FILE STATE
fstrim.timer disabled
mdadm-last-resort@.timer static
my-backup.timer enabled
systemd-readahead-done.timer indirect
systemd-tmpfiles-clean.timer static
往期推荐
限时特惠:本站每日持续更新海量各大内部网赚创业教程,会员可以下载全站资源点击查看详情
站长微信:11082411