与 cron 作业类似,systemd 定时器可以在特定的时间间隔触发事件(shell 脚本和程序),例如每天一次或在一个月中的特定某一天(或许只有在周一生效),或在从上午 8 点到下午 6 点的工作时间内每隔 15 分钟一次。定时器也可以做到 cron 作业无法做到的一些事情。举个例子,定时器可以在特定事件发生后的一段时间后触发一段脚本或者程序去执行,例如开机、启动、上个任务完成,甚至于定时器调用的上个服务单元的完成的时刻。
操作系统维护的计时器
当在一个新系统上安装 Fedora 或者是任意一个基于 systemd 的发行版时,作为系统维护过程的一部分,它会在 Linux 宿主机的后台中创建多个定时器。这些定时器会触发事件来执行必要的日常维护任务,比如更新系统数据库、清理临时目录、轮换日志文件,以及更多其他事件。
作为示例,我会查看一些我的主要工作站上的定时器,通过执行 systemctl status *timer
命令来展示主机上的所有定时器。星号的作用与文件通配相同,所以这个命令会列出所有的 systemd 定时器单元。
-
[root@testvm1 ~]# systemctl status *timer
-
● mlocate-updatedb.timer - Updates mlocate database every day
-
Loaded: loaded (/usr/lib/systemd/system/mlocate-updatedb.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
-
Triggers: ● mlocate-updatedb.service
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Updates mlocate database every day.
-
● logrotate.timer - Daily rotation of log files
-
Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Fri 2020-06-05 00:00:00 EDT; 15h left
-
Triggers: ● logrotate.service
-
Docs: man:logrotate(8)
-
man:logrotate.conf(5)
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily rotation of log files.
-
● sysstat-summary.timer - Generate summary of yesterday's process accounting
-
Loaded: loaded (/usr/lib/systemd/system/sysstat-summary.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Fri 2020-06-05 00:07:00 EDT; 15h left
-
Triggers: ● sysstat-summary.service
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Generate summary of yesterday's process accounting.
-
● fstrim.timer - Discard unused blocks once a week
-
Loaded: loaded (/usr/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Mon 2020-06-08 00:00:00 EDT; 3 days left
-
Triggers: ● fstrim.service
-
Docs: man:fstrim
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Discard unused blocks once a week.
-
● sysstat-collect.timer - Run system activity accounting tool every 10 minutes
-
Loaded: loaded (/usr/lib/systemd/system/sysstat-collect.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Thu 2020-06-04 08:50:00 EDT; 41s left
-
Triggers: ● sysstat-collect.service
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Run system activity accounting tool every 10 minutes.
-
● dnf-makecache.timer - dnf makecache --timer
-
Loaded: loaded (/usr/lib/systemd/system/dnf-makecache.timer; enabled; vendor preset: enabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Thu 2020-06-04 08:51:00 EDT; 1min 41s left
-
Triggers: ● dnf-makecache.service
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started dnf makecache –timer.
-
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
-
Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabled)
-
Active: active (waiting) since Tue 2020-06-02 08:02:33 EDT; 2 days ago
-
Trigger: Fri 2020-06-05 08:19:00 EDT; 23h left
-
Triggers: ● systemd-tmpfiles-clean.service
-
Docs: man:tmpfiles.d(5)
-
man:systemd-tmpfiles(8)
-
Jun 02 08:02:33 testvm1.both.org systemd[1]: Started Daily Cleanup of Temporary Directories.
每个定时器至少有六行相关信息:
- 定时器的第一行有定时器名字和定时器目的的简短介绍
- 第二行展示了定时器的状态,是否已加载,定时器单元文件的完整路径以及预设信息。
- 第三行指明了其活动状态,包括该定时器激活的日期和时间。
- 第四行包括了该定时器下次被触发的日期和时间和距离触发的大概时间。
- 第五行展示了被定时器触发的事件或服务名称。
- 部分(不是全部)systemd 单元文件有相关文档的指引。我虚拟机上输出中有三个定时器有文档指引。这是一个很好(但非必要)的信息。
- 最后一行是计时器最近触发的服务实例的日志条目。
你也许有一些不一样的定时器,取决于你的主机。