Ativação do soquete Systemd: mate o script bash ao fechar o soquete

Ativação do soquete Systemd: mate o script bash ao fechar o soquete

Assumindo um exemplo mínimo como emessa questão, exceto por outro script de shell.

[e-mail protegido]:

[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

Quando eu me conecto via

nc 127.0.0.1 7780

o script é invocado corretamente. Mas quando saio nccom CTRL-C, o script funciona para sempre.

Existe um mecanismo para enviar um SIGTERM para o processo de script, ao fechar o soquete (presumo que ncfaça isso ao sair)?

Responder1

Não, o systemd não interromperá o serviço quando a conexão for encerrada.

A razão pela qual isso não é possível é que, uma vez que o systemd tenha aceitado uma nova conexão ao soquete que está escutando, ele passará esse soquete para o serviço iniciado para tratar a conexão e não manterá mais nenhuma referência a essa conexão.

Para detectar quando a conexão foi encerrada pelo cliente, é necessário verificar o soquete do próprio serviço, lendo o stdin ou fazendo polling para verificar se foi fechado.

informação relacionada