GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo configurar Systemd para convertir un script simple con Standardio en un servicio de red?

Estoy tratando de configurar un script bash como un servicio de red que escucha en el puerto tcp 6666. Pero el servicio falla al inicio con estos errores:

 heartbeat]# systemctl status heartbeat.service
● heartbeat.service - Service de collecte des signaux de vie
   Loaded: loaded (/etc/systemd/system/heartbeat.service; disabled; vendor preset: disabled)
   Active: failed (Result: resources)

mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:32:48 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Unit entered failed state.
mai 12 12:32:48 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Got more than one socket.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed to run 'start' task: Invalid argument
mai 12 12:33:18 Chalet systemd[1]: Failed to start Service de collecte des signaux de vie.
mai 12 12:33:18 Chalet systemd[1]: heartbeat.service: Failed with result 'resources'.

No entiendo el significado de este mensaje "heartbeat.service:Got more than one socket". ¿Puedes ayudarme a entender dónde me equivoco?

Configuré systemd así:

latido.socket :

[Unit]
Description=Socket pour le demon heartbeat
PartOf=heartbeat.service

[Socket]
ListenStream=0.0.0.0:6666
Accept=true

[Install]
WantedBy=sockets.target

latido.servicio :

[Unit]
Description=Service de collecte des signaux de vie
After=network.target heartbeat.socket
Requires=heartbeat.socket

[Service]
Type=simple
ExecStart=/bin/bash /usr/heartbeat/heartbeat.bash
RemainAfterExit=no
StandardInput=socket
StandardOutput=inherit

[Install]
WantedBy=multi-user.target

/usr/heartbeat/heartbeat.bash es:

 #!/bin/bash
while true
do
        read -r entree
        if [[ $entree == "frequence" ]]
        then
                echo "3600"
        fi
        if [[ -n $entree ]]
        then
                logger "heartbeat receveid : $entree"
        fi
done

Respuesta aceptada:

Renombrar heartbeat.service [email protected] funcionó.

La respuesta estaba simplemente en la página de manual de systemd.socket (RTFM dos veces si uno no es suficiente...):

Para cada archivo de socket, debe existir un archivo de servicio coincidente que describa el servicio que se iniciará con el tráfico entrante en el socket (consulte systemd.service(5) para obtener más información sobre los archivos .service). El nombre de la unidad .service es por defecto el mismo que el nombre de la unidad .socket, pero se puede modificar con la opción Service=que se describe a continuación. Dependiendo de la configuración de la opción Aceptar=que se describe a continuación, esta unidad .servicio debe tener el mismo nombre que la unidad .socket, pero con el sufijo reemplazado, a menos que se anule con Servicio=; o debe ser una unidad de plantilla con el mismo nombre. Ejemplo:un archivo de socket foo.socket necesita un servicio coincidente foo.service si se establece Accept=false. Si se establece Accept=true, debe existir un archivo de plantilla de servicio [email protected] desde el cual se instancian los servicios para cada conexión entrante.

En consecuencia, el servicio no debe iniciarse ya que systemd lo instancia y lo activa la unidad de conexión (que debe iniciarse para escuchar el puerto tcp para las conexiones entrantes)

Dado que no le damos ningún nombre a la instancia, para aquellos que tengan curiosidad sobre el nombre de la instancia dado por %I en el servicio, parece ser el número de instancia menos uno (es decir, la primera instancia tiene el ID 0) :

[[email protected]Chalet ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
   Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
   Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
   Listen: 0.0.0.0:6666 (Stream)
 Accepted: 5; Connected: 5

mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[[email protected] ~]# ncat 127.0.0.1 6666              
what is %I in the service ?
^C
[[email protected] ~]# systemctl status heartbeat.socket
● heartbeat.socket - Socket pour le demon heartbeat
   Loaded: loaded (/etc/systemd/system/heartbeat.socket; disabled; vendor preset: disabled)
   Active: active (listening) since Mon 2017-05-15 15:25:03 CEST; 7h ago
   Listen: 0.0.0.0:6666 (Stream)
 Accepted: 6; Connected: 6

mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[[email protected] ~]# journalctl -ra                   
-- Logs begin at Sat 2016-11-19 19:12:18 CET, end at Mon 2017-05-15 23:02:21 CEST. --
mai 15 23:02:21 Chalet root[7224]: heartbeat receveid : what is %I in the service ?
mai 15 23:01:43 Chalet systemd[1]: Started Service de collecte des signaux de vie pour 5 (127.0.0.1:50920).

Linux
  1. ¿Cómo escribir un script de inicio para Systemd?

  2. CentOS / RHEL 7:Cómo configurar serial getty con systemd

  3. Cómo detener el servicio systemd

  4. ¿Cómo ejecuto un script antes que todo lo demás al apagar con systemd?

  5. ¿Cómo obtener menos ttys con Systemd?

Cómo ejecutar contenedores como servicio Systemd con Podman

Cómo ejecutar Shell Script como servicio Systemd en Linux

Administrar cgroups con systemd

Cómo configurar la ejecución automática de un script de Python usando Systemd

Cómo ejecutar Shell Script como servicio SystemD en Linux

¿Cómo creo un script de configuración?