Asumiendo un ejemplo mínimo como enesta pregunta, excepto por otro script de shell.
[correo electrónico 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
sistemafoo.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
Cuando me conecto vía
nc 127.0.0.1 7780
el script se invoca correctamente. Pero cuando salgo nc
con CTRL-C, el script se ejecuta para siempre.
¿Existe algún mecanismo para enviar un SIGTERM al proceso de secuencia de comandos al cerrar el socket (supongo nc
que lo hace al salir)?
Respuesta1
No, systemd no detendrá el servicio cuando se cierre la conexión.
La razón por la que no es posible es que, una vez que systemd haya aceptado una nueva conexión al socket en el que está escuchando, pasará ese socket al servicio que comenzó a manejar la conexión y ya no mantendrá ninguna referencia a esa conexión.
Para detectar cuándo el cliente cerró la conexión, debe verificar el socket desde el propio servicio, leyendo desde la entrada estándar o sondeándolo para verificar si se cerró.