如何使用 systemd 限制服务/套接字的访问/激活时间?

如何使用 systemd 限制服务/套接字的访问/激活时间?

我有一个由系统套接字激活的简单 systemd 服务。

就这么简单(稍微简化了):

$ systemctl cat example.socket 
# /usr/lib/systemd/system/example.socket
[Unit]
Description=Example Server socket

[Socket]
ListenStream=80
Accept=true

[Install]
WantedBy=sockets.target
$ systemctl cat [email protected] 
# /usr/lib/systemd/system/[email protected]
[Unit]
Description=Example Server

[Service]
StandardInput=socket
StandardOutput=socket
StandardError=journal
ExecStart=/usr/libexec/example
User=example

现在我想要的是实现一个基本的访问限制按时间。即我想限制一天中可以从外部激活/访问套接字/服务的时间,因此它仅在一天的某些时间可用,例如

我知道我可以用来systemctl edit覆盖这些选项,但实际上我没有找到可以设置的选项。我浏览了有关系统套接字的手册页关于时间的唯一选项是TriggerLimitIntervalSec左右,这不符合我的要求。

为了比较这个,一个古老的小工具xinetdx,它可以做同样的事情,即监听套接字并按需启动进程(服务器)有一个选项Called access_times,可用于指定服务何时可用。但将其用作另一个工具(/依赖项)并不是我想要的。我的目标是一种集成到 systemd 中的方法。

答案1

你可以使用一些系统计时器在需要的时间启动/停止套接字。

mysocket.socket每天早上 06:00 起床并在每晚 23:00 睡觉,请尝试以下操作:

# mysocket.timer
[Unit]
Description=Socket Wakeup

[Timer]
OnCalendar=6:00
Unit=mysocket.socket

[Install]
WantedBy=timers.target
# mysocket-bedtime.timer
[Unit]
Description=Socket Bedtime

[Timer]
OnCalendar=23:00
Unit=mysocket-bedtime.service

[Install]
WantedBy=timers.target
# mysocket-bedtime.service
[Unit]
Description=MySocket bedtime enforcer
Conflicts=mysocket.socket

[Service]
Type=oneshot
ExecStart=/bin/true

mysocket.timer非常简单。Unit=mysocket.socket每天早上 06:00开始。停止套接字有点困难。它需要一种Conflicts=关系。我们设计mysocket-bedtime.timer每天晚上 23:00 唤醒那个冲突的单位。 mysocket-bedtime.service是那个冲突的单位。为了启动它,它将关闭它所Conflicts=使用的任何东西(你的套接字)。然后,当您的套接字停止时,它只是执行true然后自行停止。

相关内容