GNU/Linux >> Linux Esercitazione >  >> Linux

Come configurare Systemd per trasformare un semplice script con Standardio in un servizio di rete?

Sto provando a configurare uno script bash come servizio di rete in ascolto sulla porta TCP 6666. Ma il servizio non riesce all'avvio con questi errori:

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

Non capisco cosa significhi questo messaggio "heartbeat.service:Got più di un socket". Potete aiutarmi a capire dove sbaglio?

Ho configurato systemd in questo modo:

heartbeat.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 è :

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

Risposta accettata:

La ridenominazione di heartbeat.service [email protected] ha funzionato.

La risposta era semplicemente nella manpage systemd.socket (RTFM due volte se uno non è abbastanza...) :

Per ogni file socket, deve esistere un file di servizio corrispondente, che descriva il servizio da avviare sul traffico in entrata sul socket (consultare systemd.service(5) per ulteriori informazioni sui file .service). Il nome dell'unità .service è per impostazione predefinita lo stesso del nome dell'unità .socket, ma può essere modificato con l'opzione Service=descritta di seguito. A seconda dell'impostazione dell'opzione Accept=descritta di seguito, questa unità .service deve essere denominata come l'unità .socket, ma con il suffisso sostituito, a meno che non venga sovrascritta con Service=; oppure deve essere un'unità modello denominata allo stesso modo. Esempio:un file socket foo.socket necessita di un servizio corrispondente foo.service se Accept=false è impostato. Se Accept=true è impostato, deve esistere un file modello di servizio [email protected] da cui vengono istanziate i servizi per ogni connessione in entrata.

Di conseguenza il servizio non deve essere avviato poiché è istanziato da systemd e attivato dall'unità socket (che deve essere avviata per ascoltare la porta tcp per le connessioni in entrata)

Dal momento che non diamo alcun nome all'istanza, per coloro che sarebbero curiosi del nome dell'istanza fornito da %I nel servizio, sembra essere il numero di istanza meno uno (ovvero la prima istanza ha lo 0 ID ) :

[[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. Come configurare le impostazioni di rete con i ruoli di sistema Ansible

  2. Come scrivere uno script di avvio per Systemd?

  3. CentOS / RHEL 7:come configurare getty seriale con systemd

  4. Come posso configurare un servizio systemd per il riavvio periodico?

  5. Come eseguo uno script prima di tutto il resto all'arresto con systemd?

Come eseguire container come servizio Systemd con Podman

Come eseguire lo script della shell come servizio Systemd in Linux

Gestire cgroup con systemd

Come configurare l'esecuzione automatica di uno script Python utilizzando Systemd

Come eseguire lo script della shell come servizio SystemD in Linux

Come faccio a creare uno script di configurazione?