我正在将cron作业转换为systemd计时器。 我使用计时器已有几年了,但是通常,我学到的知识足以执行我正在从事的任务。 在研究这个systemd系列产品时 ,我了解到systemd计时器具有一些非常有趣的功能。

像cron作业一样,systemd计时器可以按指定的时间间隔触发事件(shell脚本和程序),例如每天一次,每月的某一天(也许只有星期一)或工作时间内每15分钟触发一次从8am到6pm。 计时器还可以执行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单元文件具有指向相关文档的指针。 虚拟机输出中的三个计时器都有指向文档的指针。 这是一个不错的(但可选)数据。
  • 最后一行是计时器触发的最新服务实例的日志条目。

根据您的主机,您可能会有一组不同的计时器。

创建一个计时器

尽管我们可以解构一个或多个现有计时器来了解它们的工作原理,但让我们创建自己的服务单元和一个计时器单元来触发它。 为了保持简单,我们将使用一个非常简单的示例。 完成此操作后,您将更容易了解其他计时器的工作原理并确定它们在做什么。

首先,创建一个简单的服务,它将运行一些基本操作,例如free命令。 例如,您可能要定期监视空闲内存。 在/etc/systemd/system目录中创建以下myMonitor.service单元文件。 它不需要是可执行的:

# This service unit is for testing timer units
# By David Both
# Licensed under GPL V2
#

[ Unit ]
Description =Logs system statistics to the systemd journal
Wants =myMonitor.timer

[ Service ]
Type =oneshot
ExecStart = / usr / bin / free

[ Install ]
WantedBy =multi-user.target


这是关于您可以创建的最简单的服务单元。 现在,让我们看一下状态并测试我们的服务单元,以确保其正常工作。

[ root @ testvm1 system ] # systemctl status myMonitor.service
● myMonitor.service - Logs system statistics to the systemd journal
Loaded: loaded ( / etc / systemd / system / myMonitor.service; disabled; vendor preset: disabled )
Active: inactive ( dead )
[ root @ testvm1 system ] # systemctl start myMonitor.service
[ root @ testvm1 system ] #

输出在哪里? 默认情况下,由systemd服务单元运行的程序的标准输出( STDOUT )被发送到systemd日志,这留下了您现在可以稍后查看的记录,直到某个时刻。 (在本系列的后续文章中,我将研究系统化的日记记录和保留策略。)请查看专门针对您的服务部门以及仅适用于今天的日记。 -S选项是--since ,它允许您指定journalctl工具应搜索条目的时间段。 这不是因为您不关心先前的结果-在这种情况下,不会有任何结果-如果您的主机已经运行了很长时间并且积累了大量条目,则可以缩短搜索时间在日记中:

[ root @ testvm1 system ] # journalctl -S today -u myMonitor.service
-- Logs begin at Mon 2020 -06-08 07: 47 : 20 EDT, end at Thu 2020 -06- 11 09: 40 : 47 EDT. --
Jun 11 09: 12 :09 testvm1.both.org systemd [ 1 ] : Starting Logs system statistics to the systemd journal...
Jun 11 09: 12 :09 testvm1.both.org free [ 377966 ] :               total        used        free      shared  buff / cache   available
Jun 11 09: 12 :09 testvm1.both.org free [ 377966 ] : Mem:       12635740      522868    11032860        8016     1080012    11821508
Jun 11 09: 12 :09 testvm1.both.org free [ 377966 ] : Swap:       8388604           0     8388604
Jun 11 09: 12 :09 testvm1.both.org systemd [ 1 ] : myMonitor.service: Succeeded.
[ root @ testvm1 system ] #

服务触发的任务可以是单个程序,一系列程序或以任何脚本语言编写的脚本。 通过myMonitor.service到myMonitor.service单元文件的[Service]部分的末尾,向该[Service]添加另一个任务:

 ExecStart = / usr / bin / lsblk 

再次启动该服务,并检查日志中的结果,结果应如下所示。 您应该在日志中看到两个命令的结果:

Jun 11 15 : 42 : 18 testvm1.both.org systemd [ 1 ] : Starting Logs system statistics to the systemd journal...
Jun 11 15 : 42 : 18 testvm1.both.org free [ 379961 ] :               total        used        free      shared  buff / cache   available
Jun 11 15 : 42 : 18 testvm1.both.org free [ 379961 ] : Mem:       12635740      531788    11019540        8024     1084412    11812272
Jun 11 15 : 42 : 18 testvm1.both.org free [ 379961 ] : Swap:       8388604           0     8388604
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] : NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] : sda             8 : 0    0  120G  0 disk
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] : ├─sda1          8 : 1    0    4G  0 part / boot
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] : └─sda2          8 : 2    0  116G  0 part
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   ├─VG01-root 253 : 0    0    5G  0 lvm  /
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   ├─VG01-swap 253 : 1    0    8G  0 lvm  [ SWAP ]
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   ├─VG01-usr  253 : 2    0   30G  0 lvm  / usr
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   ├─VG01-tmp  253 : 3    0   10G  0 lvm  / tmp
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   ├─VG01-var  253 : 4    0   20G  0 lvm  / var
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] :   └─VG01-home 253 : 5    0   10G  0 lvm  / home
Jun 11 15 : 42 : 18 testvm1.both.org lsblk [ 379962 ] : sr0            11 : 0    1 1024M  0 rom
Jun 11 15 : 42 : 18 testvm1.both.org systemd [ 1 ] : myMonitor.service: Succeeded.
Jun 11 15 : 42 : 18 testvm1.both.org systemd [ 1 ] : Finished Logs system statistics to the systemd journal.

既然您知道您的服务将按预期工作, myMonitor.timer/etc/systemd/system创建计时器单元文件myMonitor.timer ,并添加以下内容:

# This timer unit is for testing
# By David Both
# Licensed under GPL V2
#

[ Unit ]
Description =Logs some system statistics to the systemd journal
Requires =myMonitor.service

[ Timer ]
Unit =myMonitor.service
OnCalendar = * - * - * * : * :00

[ Install ]
WantedBy =timers.target


myMonitor.timer file *-*-* *:*:00OnCalendar时间规范应触发计时器,每分钟执行一次myMonitor.service单元。 我将在本文的后面部分探讨OnCalendar设置。

现在,观察由计时器触发的与运行服务有关的所有日记帐分录。 您也可以遵循计时器,但是遵循服务可以使您几乎实时地查看结果。 使用-f (follow)选项运行journalctl

[ root @ testvm1 system ] # journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020 -06-08 07: 47 : 20 EDT. --

启动,但不启用计时器,看看它运行一段时间后会发生什么:

[ root @ testvm1 ~ ] # systemctl start myMonitor.service
[ root @ testvm1 ~ ] #

一个结果立即显示出来,而下一个结果则以一分钟的间隔出现。 观看日志几分钟,看看您是否注意到我做的同样的事情:

[ root @ testvm1 system ] # journalctl -S today -f -u myMonitor.service
-- Logs begin at Mon 2020 -06-08 07: 47 : 20 EDT. --
Jun 13 08: 39 : 18 testvm1.both.org systemd [ 1 ] : Starting Logs system statistics to the systemd journal...
Jun 13 08: 39 : 18 testvm1.both.org systemd [ 1 ] : myMonitor.service: Succeeded.
Jun 13 08: 39 : 19 testvm1.both.org free [ 630566 ] :               total        used        free      shared  buff / cache   available
Jun 13 08: 39 : 19 testvm1.both.org free [ 630566 ] : Mem:       12635740      556604    10965516        8036     1113620    11785628
Jun 13 08: 39 : 19 testvm1.both.org free [ 630566 ] : Swap:       8388604           0     8388604
Jun 13 08: 39 : 18 testvm1.both.org systemd [ 1 ] : Finished Logs system statistics to the systemd journal.
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] : NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] : sda             8 : 0    0  120G  0 disk
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] : ├─sda1          8 : 1    0    4G  0 part / boot
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] : └─sda2          8 : 2    0  116G  0 part
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   ├─VG01-root 253 : 0    0    5G  0 lvm  /
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   ├─VG01-swap 253 : 1    0    8G  0 lvm  [ SWAP ]
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   ├─VG01-usr  253 : 2    0   30G  0 lvm  / usr
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   ├─VG01-tmp  253 : 3    0   10G  0 lvm  / tmp
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   ├─VG01-var  253 : 4    0   20G  0 lvm  / var
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] :   └─VG01-home 253 : 5    0   10G  0 lvm  / home
Jun 13 08: 39 : 19 testvm1.both.org lsblk [ 630567 ] : sr0            11 : 0    1 1024M  0 rom
Jun 13 08: 40 : 46 testvm1.both.org systemd [ 1 ] : Starting Logs system statistics to the systemd journal...
Jun 13 08: 40 : 46 testvm1.both.org free [ 630572 ] :               total        used        free      shared  buff / cache   available
Jun 13 08: 40 : 46 testvm1.both.org free [ 630572 ] : Mem:       12635740      555228    10966836        8036     1113676    11786996
Jun 13 08: 40 : 46 testvm1.both.org free [ 630572 ] : Swap:       8388604           0     8388604
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] : NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] : sda             8 : 0    0  120G  0 disk
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] : ├─sda1          8 : 1    0    4G  0 part / boot
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] : └─sda2          8 : 2    0  116G  0 part
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   ├─VG01-root 253 : 0    0    5G  0 lvm  /
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   ├─VG01-swap 253 : 1    0    8G  0 lvm  [ SWAP ]
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   ├─VG01-usr  253 : 2    0   30G  0 lvm  / usr
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   ├─VG01-tmp  253 : 3    0   10G  0 lvm  / tmp
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   ├─VG01-var  253 : 4    0   20G  0 lvm  / var
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] :   └─VG01-home 253 : 5    0   10G  0 lvm  / home
Jun 13 08: 40 : 46 testvm1.both.org lsblk [ 630574 ] : sr0            11 : 0    1 1024M  0 rom
Jun 13 08: 40 : 46 testvm1.both.org systemd [ 1 ] : myMonitor.service: Succeeded.
Jun 13 08: 40 : 46 testvm1.both.org systemd [ 1 ] : Finished Logs system statistics to the systemd journal.
Jun 13 08: 41 : 46 testvm1.both.org systemd [ 1 ] : Starting Logs system statistics to the systemd journal...
Jun 13 08: 41 : 46 testvm1.both.org free [ 630580 ] :               total        used        free      shared  buff / cache   available
Jun 13 08: 41 : 46 testvm1.both.org free [ 630580 ] : Mem:       12635740      553488    10968564        8036     1113688    11788744
Jun 13 08: 41 : 46 testvm1.both.org free [ 630580 ] : Swap:       8388604           0     8388604
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] : NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] : sda             8 : 0    0  120G  0 disk
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] : ├─sda1          8 : 1    0    4G  0 part / boot
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] : └─sda2          8 : 2    0  116G  0 part
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   ├─VG01-root 253 : 0    0    5G  0 lvm  /
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   ├─VG01-swap 253 : 1    0    8G  0 lvm  [ SWAP ]
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   ├─VG01-usr  253 : 2    0   30G  0 lvm  / usr
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   ├─VG01-tmp  253 : 3    0   10G  0 lvm  / tmp
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   ├─VG01-var  253 : 4    0   20G  0 lvm  / var
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] :   └─VG01-home 253 : 5    0   10G  0 lvm  / home
Jun 13 08: 41 : 47 testvm1.both.org lsblk [ 630581 ] : sr0            11 : 0    1 1024M  0 rom
Jun 13 08: 41 : 47 testvm1.both.org systemd [ 1 ] : myMonitor.service: Succeeded.
Jun 13 08: 41 : 47 testvm1.both.org systemd [ 1 ] : Finished Logs system statistics to the systemd journal.

确保检查计时器和服务的状态。

来自ExecStart STDOUT触发器将存储在myMonitor.service单元中的日记中。 这就是使用systemd运行服务的全部部分。 但是,这确实意味着您可能需要注意从服务单元运行脚本以及它们生成多少STDOUT

第二件事是计时器不会在:00秒的分钟或从前一实例开始的精确一分钟触发。 这是有意的,但是可以在必要时覆盖它(或者如果它只是冒犯了sysadmin敏感性)。

此行为的原因是为了防止多个服务完全同时触发。 例如,您可以使用时间规格,例如每周,每天等等。 这些快捷方式均已定义为在触发当天的00:00:00小时触发。 当以此方式指定多个计时器时,它们很可能会尝试同时启动。

systemd计时器经过专门设计,可以在指定时间左右随机触发,以防止同时触发。 它们在时间窗口内半随机触发,该时间窗口从指定的触发时间开始,到指定的时间加一分钟结束。 根据systemd.timer手册页,此触发时间相对于所有其他定义的计时器单元保持在稳定的位置。 您可以在上面的日记条目中看到,计时器在启动时立即触发,然后在每分钟大约46或47秒后触发。

在大多数情况下,这种概率触发时间很好。 安排诸如备份之类的任务运行时,只要它们在下班时间运行,就不会有问题。 系统管理员可以选择确定性的开始时间,例如典型的cron作业规范中的01:05:00,以不与其他任务冲突,但是可以通过很大的时间值来完成。 开始时间中一分钟的随机性通常是无关紧要的。

但是,对于某些任务,绝对的触发时间是绝对必要的。 对于这些,您可以通过将以下语句添加到计时器单位文件的“ Timer部分中来指定更高的触发时间跨度精度(以微秒为单位):

 AccuracySec =1us 

时间跨度可用于指定所需的精度,以及定义重复事件或一次性事件的时间跨度。 它可以识别以下单位:

  • usc,我们,微秒
  • 毫秒,毫秒
  • 秒,秒,秒
  • 分钟,分钟,分钟,米
  • 小时,小时,小时,小时
  • 天,天,d
  • 周,周,周
  • 月,月,M(定义为30.44天)
  • 年,年,y(定义为365.25天)

/usr/lib/systemd/system所有默认计时器都为精度指定了更大的范围,因为精确时间并不重要。 查看系统创建的计时器中的一些规范:

[ root @ testvm1 system ] # grep Accur /usr/lib/systemd/system/*timer
/ usr / lib / systemd / system / fstrim.timer: AccuracySec =1h
/ usr / lib / systemd / system / logrotate.timer: AccuracySec =1h
/ usr / lib / systemd / system / logwatch.timer: AccuracySec =12h
/ usr / lib / systemd / system / mlocate-updatedb.timer: AccuracySec =24h
/ usr / lib / systemd / system / raid-check.timer: AccuracySec =24h
/ usr / lib / systemd / system / unbound-anchor.timer: AccuracySec =24h
[ root @ testvm1 system ] #

/usr/lib/systemd/system目录中查看某些计时器单元文件的完整内容,以了解它们的构造方式。

您不必启用此实验中的计时器即可在启动时将其激活,但是执行该命令的命令将是:

 [ root @ testvm1 system ] # systemctl enable myMonitor.timer 

您创建的单元文件不需要可执行。 您还没有启用服务单元,因为它是由计时器触发的。 如果需要,您仍然可以从命令行手动触发服务单元。 试试看,观察日志。

有关计时器精度,事件时间规格和触发事件的更多信息,请参见systemd.timersystemd.time的手册页。

计时器类型

systemd计时器具有cron所没有的其他功能,仅在特定,重复,实时的日期和时间触发。 可以将systemd计时器配置为基于其他systemd单元中的状态变化进行触发。 例如,可以将计时器配置为在系统引导之后,启动之后或激活定义的服务单元之后触发特定的经过时间。 这些称为单调计时器。 单调是指连续增加的计数或序列。 这些计时器不是持久性的,因为它们在每次引导后都会重置。

表1列出了单调计时器以及每个计时器的简短定义以及OnCalendar计时器,该计时器不是单调的,用于指定将来的时间,该时间可能重复也可能不重复。 此信息是从systemd.timer手册页派生而来,但systemd.timer了一些小的更改。

计时器 单调的 定义
OnActiveSec= X 这相对于计时器被激活的时刻定义了一个计时器。
OnBootSec= X 这定义了相对于机器启动的计时器。
OnStartupSec= X 这定义了相对于服务管理器首次启动的计时器。 对于系统计时器单元,这与OnBootSec=非常相似,因为系统服务管理器通常在启动时就很早启动。 当以在每个用户服务管理器中运行的单元进行配置时,它尤其有用,因为用户服务管理器通常仅在首次登录时启动,而不是在启动过程中启动。
OnUnitActiveSec= X 这定义了相对于上一次要激活的计时器的激活时间的计时器。
OnUnitInactiveSec= X 相对于上一次要激活的计时器的时间,它定义了一个计时器。
OnCalendar= 这使用日历事件表达式定义了实时(即挂钟)计时器。 有关日历事件表达式的语法的更多信息,请参见systemd.time(7) 。 否则,语义类似于OnActiveSec=和相关设置。 此计时器与cron服务最相似。

表1:systemd计时器定义

单调计时器的时间跨度可以使用与前面提到的AccuracySec语句相同的快捷方式名称,但是systemd会将这些名称标准化为秒。 例如,您可能想指定一个计时器,该计时器在系统启动五天后一次触发一次事件; 可能看起来像: OnBootSec=5d 。 如果主机在2020-06-15 09:45:27引导,则计时器将在2020-06-20 09:45:27或之后的一分钟内触发。

日历活动规范

日历事件规范是在所需的重复时间触发计时器的关键部分。 首先查看与OnCalendar设置一起使用的一些规格。

与crontab中使用的格式相比,systemd及其计时器使用的时间和日期规范风格不同。 它比crontab更加灵活,并且可以按at命令的方式允许模糊的日期和时间。 还应该足够熟悉,以使其易于理解。

使用OnCalendar=计时器的基本格式为DOW YYYY-MM-DD HH:MM:SS 。 DOW(星期几)是可选的,其他字段可以使用星号(*)匹配该位置的任何值。 所有日历时间格式都将转换为规范化格式。 如果未指定时间,则假定为00:00:00。 如果未指定日期,但指定了时间,则下一场比赛可能是今天或明天,具体取决于当前时间。 名称或数字可用于一周中的月份和日期。 可以指定每个单元的逗号分隔列表。 单位范围可以在起始值和结束值之间用..指定。

有几个有趣的选项可以指定日期。 波浪号(〜)可用于指定该月的最后一天或该月的最后一天之前的指定天数。 “ /”可用于指定星期几作为修饰符。

这是OnCalendar语句中使用的一些典型时间规范的一些示例。

日历事件规范 描述
DOW YYYY-MM-DD HH:MM:SS
*-*-* 00:15:30 每年每个月的每天午夜15分30秒后
Weekly 每个星期一的00:00:00
Mon *-*-* 00:00:00 与每周相同
Mon 与每周相同
Wed 2020-*-* 2020年每个星期三的00:00:00
Mon..Fri 2021-*-* 2021年的每个工作日00:00:00
2022-6,7,8-1,15 01:15:00 2022年6月1日至15日上午01:15:00
Mon *-05~03 每年的5月的下一个星期一发生,这也是该月末的第3天。
Mon..Fri *-08~04 任何年份的8月底前的第4天,也属于工作日。
*-05~03/2 从5月底开始的第3天,然后再过两天。 每年重复一次。 请注意,此表达式使用波浪号(〜)。
*-05-03/2 5月的第三天,然后是5月其余的第二天。 每年重复一次。 请注意,此表达式使用破折号(-)。

表2:示例OnCalendar事件规范

测试日历规格

systemd提供了一个出色的工具,可用于验证和检查计时器中的日历时间事件规范。 systemd-analyze calendar工具解析日历时间事件规范,并提供规范化形式以及其他有趣的信息,例如下一个“经过”(即匹配)的日期和时间以及触发时间之前的大概时间到达了。

首先,查看没有时间的未来日期(请注意, Next elapseUTC将根据您所在的时区而有所不同):

[ student @ studentvm1 ~ ] $ systemd-analyze calendar 2030 -06- 17
Original form: 2030 -06- 17                
Normalized form: 2030 -06- 17 00:00:00        
Next elapse: Mon 2030 -06- 17 00:00:00 EDT
( in UTC ) : Mon 2030 -06- 17 04:00:00 UTC
From now: 10 years 0 months left    
[ root @ testvm1 system ] #

现在添加时间。 在此示例中,日期和时间作为不相关的实体分别进行分析:

[ root @ testvm1 system ] # systemd-analyze calendar 2030-06-17 15:21:16
Original form: 2030 -06- 17                
Normalized form: 2030 -06- 17 00:00:00        
Next elapse: Mon 2030 -06- 17 00:00:00 EDT
( in UTC ) : Mon 2030 -06- 17 04:00:00 UTC
From now: 10 years 0 months left

Original form: 15 : 21 : 16                  
Normalized form: * - * - * 15 : 21 : 16            
Next elapse: Mon 2020 -06- 15 15 : 21 : 16 EDT
( in UTC ) : Mon 2020 -06- 15 19 : 21 : 16 UTC
From now: 3h 55min left              
[ root @ testvm1 system ] #


要将日期和时间作为一个整体进行分析,请将其用引号引起来。 在计时器单元的OnCalendar=事件规范中使用引号时,请确保将其删除,否则会出现错误:

[ root @ testvm1 system ] # systemd-analyze calendar "2030-06-17 15:21:16"
Normalized form: 2030 -06- 17 15 : 21 : 16        
Next elapse: Mon 2030 -06- 17 15 : 21 : 16 EDT
( in UTC ) : Mon 2030 -06- 17 19 : 21 : 16 UTC
From now: 10 years 0 months left    
[ root @ testvm1 system ] #

现在测试表2中的条目。我喜欢最后一个,尤其是:

[ root @ testvm1 system ] # systemd-analyze calendar "2022-6,7,8-1,15 01:15:00"
Original form: 2022 - 6 , 7 , 8 - 1 , 15 01: 15 :00
Normalized form: 2022 -06,07,08-01, 15 01: 15 :00
Next elapse: Wed 2022 -06-01 01: 15 :00 EDT
( in UTC ) : Wed 2022 -06-01 05: 15 :00 UTC
From now: 1 years 11 months left
[ root @ testvm1 system ] #

让我们看一个示例,其中列出时间戳表达式的下五个经过时间。

[ root @ testvm1 ~ ] # systemd-analyze calendar --iterations=5 "Mon *-05~3"
Original form: Mon * -05~ 3                
Normalized form: Mon * -05~03 00:00:00      
Next elapse: Mon 2023 -05- 29 00:00:00 EDT
( in UTC ) : Mon 2023 -05- 29 04:00:00 UTC
From now: 2 years 11 months left    
Iter. #2: Mon 2028-05-29 00:00:00 EDT
( in UTC ) : Mon 2028 -05- 29 04:00:00 UTC
From now: 7 years 11 months left    
Iter. #3: Mon 2034-05-29 00:00:00 EDT
( in UTC ) : Mon 2034 -05- 29 04:00:00 UTC
From now: 13 years 11 months left    
Iter. #4: Mon 2045-05-29 00:00:00 EDT
( in UTC ) : Mon 2045 -05- 29 04:00:00 UTC
From now: 24 years 11 months left    
Iter. #5: Mon 2051-05-29 00:00:00 EDT
( in UTC ) : Mon 2051 -05- 29 04:00:00 UTC
From now: 30 years 11 months left    
[ root @ testvm1 ~ ] #

这应该为您提供足够的信息来开始测试OnCalendar时间规格。 systemd-analyze工具可用于其他有趣的分析,我将在本系列的下一篇文章中开始探讨。

摘要

可以使用systemd计时器执行与cron工具相同的任务,但是在日历和单调时间规范方面可以提供更大的灵活性来触发事件。

即使您为此实验创建的服务单元通常是由计时器触发的,您也可以随时使用systemctl start myMonitor.service命令来触发它。 可以在单个计时器中编写多个维护任务的脚本; 这些可以是Bash脚本或Linux实用程序。 您可以运行由计时器触发的服务以运行所有脚本,也可以根据需要运行单个脚本。

在下一篇文章中,我将详细探讨systemd对时间和时间规范的使用。

我尚未看到cronat将被弃用的任何迹象。 我希望不会发生,因为at ,至少是使用更容易为一次性任务调度比systemd定时器。

资源资源

互联网上有大量有关systemd的信息,但是很多信息简洁,晦涩甚至是误导。 除了本文提到的资源之外,以下网页还提供了有关systemd启动的更详细和可靠的信息。

  • Fedora项目对systemd有很好的实用指南 。 它具有使用systemd配置,管理和维护Fedora计算机所需的几乎所有知识。
  • Fedora项目还有一个很好的备忘单 ,可以将旧的SystemV命令与可比的systemd命令进行交叉引用。
  • 有关systemd及其创建原因的详细技术信息,请查看Freedesktop.org 对systemd的描述 。
  • Linux.com的“更多系统乐趣”提供了更多高级系统信息和技巧 。

还有systemd的设计师和主要开发者Lennart Poettering撰写的一系列针对Linux sysadmin的技术性文章。 这些文章是在2010年4月至2011年9月之间撰写的,但它们现在和那时一样具有相关性。 关于systemd及其生态系统的许多其他优点都基于这些论文。

  • 重新思考PID 1
  • 系统管理员,第一部分
  • 系统管理员,第二部分
  • 系统管理员,第三部分
  • 管理员专用的systemd,第IV部分
  • 系统管理员,第五部分
  • 管理员专用的systemd,第VI部分
  • 管理员专用系统,第七部分
  • 管理员专用的系统化第八部分
  • 管理员专用的systemd,第IX部分
  • 适用于管理员的systemd,第X部分
  • 管理员专用系统,第十一部分

翻译自: https://opensource.com/article/20/7/systemd-timers

使用系统计时器而不是cronjobs相关推荐

  1. .net随笔-vb.net 系统计时器

    TickCount属性提供对计算机的系统计时器的访问,从计算机的系统计时器获取毫秒计数. 该计时器在计算机处于活动状态时运行.定时器的分辨率不小于500毫秒. 您可以使用此属性使您的应用程序的行为依赖 ...

  2. 【芯片应用】具有看门狗功能的超低功耗系统计时器TPL5010

    目录 一.简介 二.同系列对比 三.引脚 四.应用推荐 五.编程 六.PCB设计 七.封装分享 一.简介 具有看门狗功能的纳瓦级功耗系统计时器-TPL5010 TPL5010是一款超低功耗的计时器,其 ...

  3. 屏幕广播系统_如何设计系统,而不是屏幕

    屏幕广播系统 重点 (Top highlight) Over the past several decades, rapid advances in technology have dramatica ...

  4. android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...

    我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹:sys/bus/msm_subsys/devi ...

  5. php考试系统计时器插件,js考试时间计时器倒计时代码

    请大家注意,下面代码的功能,实现的是考试倒及时效果.倒计时的提示文字,显示在一个名为TestTime的Div里面. 在使用的时候,并非是页面载入就自动进入倒计时,而是需要触发StartTimerObj ...

  6. E-Learning是学习系统而不是教育系统

    从我开始开发企业E-Learning系统到现在已经四年了.这四年实在是有很多槽要吐,因此以下是一些胡言乱语.莫怪. 几乎每个E-Learning系统均打着"随时","随地 ...

  7. [转载]C#中各种计时器

    1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch) Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.在典型的 S ...

  8. 基于JavaScript的问卷调查系统

    文章目录 1.题目要求 2.项目流程介绍 3.项目源码 3.1.html源码 3.2.css代码 3.3.部分js代码 1.题目要求 要求: 1.设计一份调查问卷,问卷分为单选题和多选题: 2.问卷答 ...

  9. C#中各种计时器 Stopwatch、TimeSpan

    1.使用 Stopwatch 类 (System.Diagnostics.Stopwatch) Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间. 在典型的 ...

最新文章

  1. UVA - 1594 Ducci Sequence
  2. Rhel7 Ldap为本地用户认证方式,设置域、服务器位置和下载key
  3. Firewalld,iptables概述(netfilter和Firewalld,iptables三者之间的关系,四表五链,Firewalld防火墙的配置方发,SNAT,DNAT了解)
  4. Linux 命令之 newgrp -- 登入另一个群组
  5. Linux 命令之 grep -- 强大的文本搜索工具/正则表达式搜索
  6. matlab简单分析数字滤波器FIR
  7. struct 和typedef struct的区别
  8. vrrp 的mac是怎么算出来的_宇宙总质量约10^55kg,与大家掰一掰是怎么算出来的
  9. 读书笔记(从0到1)
  10. 思科模拟器5506防火墙配置_企业办公网络配置不求人之二
  11. APP上架需要准备的材料清单(上架规范和流程)
  12. Android OpenGL探索之纯色背景绘制
  13. 在excel中如何快速准确录入身份证号码?
  14. 还想野蛮生长?互联网金融有《意见》了
  15. Mysql NDB Cluster搭建测试
  16. 描述统计学(二):汇总两个变量数据间关系
  17. Python——turtle(海龟绘图)
  18. 过宝塔php大马,分享宝塔网站防火墙使用帮助
  19. PBR--RTR4笔记--第八章 光与颜色
  20. php 微信 ca证书出错,升级CA颁发的证书后微信退款、红包等无法使用

热门文章

  1. python shutil模块安装_python shutil模块
  2. 快速架构通用AI模型生产体系,商汤科技是怎么做到的?
  3. 我的世界JAVA能改ID吗_我的世界_MC_我的世界Java版帐号将迁移_小皮单机游戏_我的世界Java版帐号将迁移至微软账号详情_小皮单机游戏...
  4. 简单操作在电脑上实现微信多开
  5. Centos安装拼音
  6. creator 学习之mask(刮刮卡效果)
  7. [FineReport]重复与冻结设置
  8. 基于微信小程序带后端ssm接口小区物业管理平台设计
  9. 给计算机专业大一新生的一些学习规划建议
  10. 读书感受 之 《以眨眼干杯》