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

今私が望むのは基本を実装することです。訪問制限時間別。つまり、ソケット/サービスを外部で有効/アクセスできる時間を制限して、1日の特定の時間にのみ使用できるようにしたいと思います。

これをオーバーライドするために使用できるオプションがあることはわかっていますが、systemctl edit実際に設定できるオプションが見つかりませんでした。システムソケットのマニュアルページを見ました。時間に関連する唯一のオプションはTriggerLimitIntervalSec左と右ですが、私の要件を満たしていません。

xinetdxこれを比較するために、同じタスクを実行する古い小さなツール、つまりソケットを受け取り、要求に応じてプロセス(サーバー)を起動します。オプションがありますaccess_timesサービスが利用可能な時期を指定するために使用できる呼び出されます。しかし、それを別のツール(/dependent)として使用することは私が望むものではありません。私の目標はsystemdに統合する方法です。

答え1

少し使ってもいいシステムタイマー必要な時間にソケットを起動/停止します。

毎朝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時に衝突するユニットを目覚めさせるように設計しました。 mysocket-bedtime.service紛争を経験しているユニットです。起動にConflicts=使用しているすべてのアイテム(ソケット)を閉じます。その後、ソケットが停止すると実行され、それtrue自体が停止します。

関連情報