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:00Persistent=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:00OnCalendar=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.timerCreated 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-timersNEXT LEFT LAST PASSED UNIT ACTIVATESSat 2023-03-18 03:00:00 UTC 6h left n/a n/a my-backup.timer my-backup.serviceSat 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 timerUNIT FILE                    STATEfstrim.timer                 disabledmdadm-last-resort@.timer     staticmy-backup.timer              enabledsystemd-readahead-done.timer indirectsystemd-tmpfiles-clean.timer static

往期推荐

限时特惠:本站每日持续更新海量各大内部网赚创业教程,会员可以下载全站资源点击查看详情
站长微信:11082411

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。