Angenommen, es handelt sich um ein Minimalbeispiel wie indiese Frage, außer einem anderen Shell-Skript.
[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 nc
mit 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 nc
dies 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.