如何配置多个 systemd 服务以使用一个计时器?

如何配置多个 systemd 服务以使用一个计时器?

我注意到一些 systemd 文档和操作方法文档中关于如何配置一个或多个服务以使用同一个计时器的方法存在显著差异。

据我所知(尽管我可能错了),这将描述通缉者单元需要将服务和计时器文件中的参数设置为(这里不使用实际的代码示例 - 为了减少帖子长度)用于单个服务,反之使用单个计时器进行多个服务配置:

单个服务的定时器

My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3) 

(1)服务文件不需要带有 WantedBy 参数的 [Install] 部分。

(2)在计时器的 [Timer] 部分中,Unit 参数应该指向 My.Service1 服务文件。

(3)计时器文件有一个 WantedBy 参数,它指向将用于启动它的某个特殊系统目标。

多个服务的定时器

My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???

(1)所有服务都需要使用 WantedBy 参数连接到同一个定义的目标。

(2)[Timer] Unit 参数也应该指向目标。

有关后者配置的示例,请参阅本指南。我将把它算作示例 1。但是,我发现其他操作示例与此不同(见下文)。

示例 2示例 3说应该这样配置:

My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target

(1) 这肯定是文档中的一个疏忽,因为如果您让单元仅指向多个服务中的一个,其他服务将无法使用计时器。这可能是因为使用了“参见上文”方法,让读者回到单个服务配置,而没有真正提到(重要的是)需要更改的内容。

然后与示例 4它的配置看起来确实可以工作,但它通过直接在/etc/systemd/system/Timer.Target.wants/子目录并排除服务文件中的任何 WantedBy 参数。因此:

My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target

我见过的示例 1 和示例 4 的混合方法是在/etc/systemd/系统/目录(默认位置),并创建指向该目录下服务文件的符号链接/etc/systemd/system/Timer.Target.wants文件和排除服务文件中的 WantedBy 参数(功能上等同于示例 4),而另一个配置使用符号链接方法,但此外还在服务文件中包含 WantedBy 参数(这似乎是多余和不必要的)。

对于示例 4 和混合方法,我的问题是:为什么要将任何东西置于*.想要如果声明 WantedBy 参数是为了指示 systemd 为你执行此操作(如该参数的解释中所述),则目录根本不是必要的这一页)?

在令人困惑的多种方法中,有人可以阐明使用相同计时器配置多个服务的最佳方法吗?

答案1

如果您想使用单个计时器激活多个​​服务,请在其间插入一个目标:

计时器单元,我们称之为foo.timer

[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=foo.target

[Timer]
OnCalendar=Sat 9:00
Unit=foo.target

[Install]
WantedBy=timers.target

目标单位,我们称之为foo.target

[Unit]
Description=My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service

[Install]
Also=foo.timer

然后是两个服务xxx.serviceyyy.service

[Unit]
Description=My service XXX

[Service]
ExecStart=/bin/echo I am XXX

[Install]
Also=foo.timer
[Unit]
Description=My service YYY

[Service]
ExecStart=/bin/echo I am YYYY

[Install]
Also=foo.timer

将这四个单元文件(foo.timerfoo.targetxxx.serviceyyy.service)复制到 中/etc/systemd/systemd/。然后通过执行以下命令启用并启动计时器:

systemctl enable --now foo.timer` 

这将挂接foo.timertimers.target,这是应该引入系统上定义的所有各种计时器的通用目标。

请注意,您也可以执行systemctl enable foo.targetbtw,以及systemctl enable zzz.service,因为Also=这些单元中的行会将启用请求传播到foo.timer

答案2

systemd 计时器始终激活一个单元。

如果您想按照相同的时间表激活两个单元,我建议创建两个包含相同时间表的计时器文件以便清楚起见。

否则,您可以创建一个“服务单元”文件来启动您想要的两个服务。

我认为“WantedBy=”对于计时器单元来说不是一个特别有用的概念。

相关内容