Aktivierung des Systemd-Sockets: Bash-Skript beenden, wenn der Socket geschlossen wird

Aktivierung des Systemd-Sockets: Bash-Skript beenden, wenn der Socket geschlossen wird

Angenommen, es handelt sich um ein Minimalbeispiel wie indiese Frage, außer einem anderen Shell-Skript.

[email geschützt]:

[Unit]
Description=Foo Service
After=network.target systemfoo.socket
Requires=systemfoo.socket

[Service]
Type=oneshot
ExecStart=/bin/bash /opt/foo/foo.sh
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

systemfoo.socket

[Unit]
Description=Foo Socket
[email protected]

[Socket]
ListenStream=127.0.0.1:7780
Accept=Yes

[Install]
WantedBy=sockets.target

/opt/foo/foo.sh

#!/bin/bash

while true; do
    logger -t FOO "Connection received: $REMOTE_ADDR $REMOTE_PORT"
done

Wenn ich eine Verbindung über

nc 127.0.0.1 7780

das Skript wird korrekt aufgerufen. Aber wenn ich ncmit STRG-C beende, läuft das Skript ewig.

Gibt es einen Mechanismus, um beim Schließen des Sockets ein SIGTERM an den Skriptprozess zu senden (ich gehe davon aus, dass ncdies beim Beenden geschieht)?

Antwort1

Nein, systemd stoppt den Dienst nicht, wenn die Verbindung geschlossen wird.

Dies ist nicht möglich, weil systemd, sobald es eine neue Verbindung zu dem Socket akzeptiert hat, auf dem es lauscht, diesen Socket an den Dienst weitergibt, der mit der Handhabung der Verbindung begonnen hat, und keinen Verweis mehr auf diese Verbindung speichert.

Um zu erkennen, wann die Verbindung vom Client geschlossen wurde, müssen Sie den Socket vom Dienst selbst überprüfen, indem Sie ihn von stdin lesen oder ihn abfragen, um festzustellen, ob er geschlossen wurde.

verwandte Informationen