Assumindo um exemplo mínimo como emessa questão, exceto por outro script de shell.
[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 nc
com 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 nc
faç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.