![如何使用 systemd 限制服务/套接字的访问/激活时间?](https://linux22.com/image/191131/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20systemd%20%E9%99%90%E5%88%B6%E6%9C%8D%E5%8A%A1%2F%E5%A5%97%E6%8E%A5%E5%AD%97%E7%9A%84%E8%AE%BF%E9%97%AE%2F%E6%BF%80%E6%B4%BB%E6%97%B6%E9%97%B4%EF%BC%9F.png)
我有一个由系统套接字激活的简单 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
然后自行停止。