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).