Systemd

如何使用 systemd 限制服務/套接字的訪問/啟動時間?

  • May 19, 2021

我有一個由系統套接字啟動的簡單 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 example@.service 
# /usr/lib/systemd/system/example@.service
[Unit]
Description=Example Server

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

現在我想要的是按時間實現基本的訪問限制。即我想限制每天可以從外部啟動/訪問套接字/服務的時間,因此它僅在一天中的某些時間可用,例如

我知道我可以systemctl edit用來覆蓋選項,但實際上我沒有找到要設置的選項。我查看了有關係統套接字的手冊頁,關於時間的唯一選項是TriggerLimitIntervalSec左右,這不能滿足我的要求。

為了比較這一點,可以做同樣事情的老式小工具xinetdx,即監聽套接字並按需啟動程序(伺服器)有一個名為的選項access_times,可用於指定服務何時可用。但是將其用作另一個工具(/dependency)並不是我想要的。我的目標是採用集成方式進入 systemd。

您可以使用一些systemd 計時器在所需時間啟動/停止套接字。

每天早上06:00mysocket.socket起床,晚上 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然後自行停止。

引用自:https://unix.stackexchange.com/questions/649704