Activación del socket Systemd: elimine el script bash al cerrar el socket

Activación del socket Systemd: elimine el script bash al cerrar el socket

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 nccon 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 ncque 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ó.

información relacionada