GNU/Linux >> Tutoriels Linux >  >> Linux

Comment configurer Systemd pour transformer un script simple avec Standardio dans un service réseau ?

J'essaie de configurer un script bash en tant que service réseau écoutant sur le port tcp 6666. Mais le service échoue au démarrage avec ces erreurs :

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

Je ne comprends pas ce que signifie ce message "heartbeat.service:Got more than one socket". Pouvez-vous m'aider à comprendre où je me trompe ?

J'ai configuré systemd comme ceci :

battement de coeur.socket :

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

[Socket]
ListenStream=0.0.0.0:6666
Accept=true

[Install]
WantedBy=sockets.target

heartbeat.service :

[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 est :

 #!/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

Réponse acceptée :

Renommer heartbeat.service [email protected] a fonctionné.

La réponse se trouvait simplement dans la page de manuel de systemd.socket (RTFM deux fois si une seule ne suffit pas...) :

Pour chaque fichier de socket, un fichier de service correspondant doit exister, décrivant le service à démarrer sur le trafic entrant sur le socket (voir systemd.service(5) pour plus d'informations sur les fichiers .service). Le nom de l'unité .service est par défaut le même que le nom de l'unité .socket, mais peut être modifié avec l'option Service=décrite ci-dessous. Selon le paramétrage de l'option Accept=décrite ci-dessous, cette unité .service doit soit être nommée comme l'unité .socket, mais avec le suffixe remplacé, à moins qu'elle ne soit remplacée par Service=; ou il doit s'agir d'une unité de modèle nommée de la même manière. Exemple :un fichier socket foo.socket a besoin d'un service correspondant foo.service si Accept=false est défini. Si Accept=true est défini, un fichier de modèle de service [email protected] doit exister à partir duquel les services sont instanciés pour chaque connexion entrante.

Par conséquent, le service n'a pas besoin d'être démarré puisqu'il est instancié par systemd et déclenché par l'unité de socket (qui doit être démarrée pour écouter le port tcp pour les connexions entrantes)

Comme nous ne donnons aucun nom à l'instance, pour ceux qui seraient curieux de connaître le nom de l'instance donné par %I dans le service, il semble que ce soit le numéro d'instance moins un (c'est-à-dire que la première instance a l'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. Comment créer un service Systemd sous Linux

  2. Linux - Comment exécuter un script avec Systemd juste avant l'arrêt ?

  3. Comment arrêter le service systemd

  4. Comment exécuter un script avant tout le reste à l'arrêt avec systemd ?

  5. Comment exécuter un script avec systemd juste avant l'arrêt ?

Comment exécuter des conteneurs en tant que service Systemd avec Podman

Comment exécuter un script Shell en tant que service Systemd sous Linux

Gestion des cgroups avec systemd

Comment configurer l'exécution automatique d'un script Python à l'aide de Systemd

Comment exécuter un script Shell en tant que service SystemD sous Linux

Comment créer un script de configuration ?