Предположим, что минимальный пример такой:этот вопрос, за исключением другого скрипта оболочки.
[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 или опрашивая его, чтобы проверить, было ли оно закрыто.