Активация сокета Systemd: завершение скрипта bash при закрытии сокета

Активация сокета Systemd: завершение скрипта bash при закрытии сокета

Предположим, что минимальный пример такой:этот вопрос, за исключением другого скрипта оболочки.

[email protected]:

[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.сокет

[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

Когда я подключаюсь через

nc 127.0.0.1 7780

скрипт вызывается правильно. Но когда я выхожу ncс помощью CTRL-C, скрипт выполняется вечно.

Есть ли механизм отправки SIGTERM процессу скрипта при закрытии сокета (я предполагаю, ncчто это происходит при выходе)?

решение1

Нет, systemd не остановит службу при закрытии соединения.

Причина, по которой это невозможно, заключается в том, что после того, как systemd примет новое соединение с прослушиваемым сокетом, он передаст этот сокет службе, запущенной для обработки соединения, и больше не будет хранить никаких ссылок на это соединение.

Чтобы определить, когда соединение было закрыто клиентом, необходимо проверить сокет из самой службы, прочитав данные из stdin или опрашивая его, чтобы проверить, было ли оно закрыто.

Связанный контент