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 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:00
mysocket.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
然後自行停止。