GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie konfiguriert man Systemd, um ein einfaches Skript mit Standardio in einen Netzwerkdienst umzuwandeln?

Ich versuche, ein Bash-Skript als Netzwerkdienst einzurichten, der TCP-Port 6666 überwacht. Aber der Dienst schlägt beim Start mit diesen Fehlern fehl:

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

Ich verstehe nicht, was diese Meldung „heartbeat.service:Got more than one socket“ bedeutet. Können Sie mir helfen zu verstehen, wo ich falsch liege?

Ich habe systemd so konfiguriert:

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 ist :

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

Akzeptierte Antwort:

Das Umbenennen von heartbeat.service [email protected] hat funktioniert.

Die Antwort stand einfach in der Systemd.socket-Manpage (RTFM zweimal, wenn eines nicht reicht…) :

Für jede Socket-Datei muss eine passende Dienstdatei existieren, die den Dienst beschreibt, der bei eingehendem Datenverkehr auf dem Socket gestartet werden soll (siehe systemd.service(5) für weitere Informationen über .service-Dateien). Der Name der .service-Unit ist standardmäßig derselbe wie der Name der .socket-Unit, kann aber mit der unten beschriebenen Service=-Option geändert werden. Abhängig von der unten beschriebenen Einstellung der Accept=-Option muss diese .service-Unit entweder wie die .socket-Unit benannt werden, jedoch mit ersetztem Suffix, sofern sie nicht mit Service=überschrieben wird; oder es muss sich um eine gleichnamige Template-Unit handeln. Beispiel:Eine Socket-Datei foo.socket benötigt einen passenden Dienst foo.service, wenn Accept=false gesetzt ist. Wenn Accept=true festgelegt ist, muss eine Dienstvorlagendatei [email protected] vorhanden sein, aus der Dienste für jede eingehende Verbindung instanziiert werden.

Folglich muss der Dienst nicht gestartet werden, da er von systemd instanziiert und von der Socket-Unit getriggert wird (die gestartet werden muss, um den TCP-Port auf eingehende Verbindungen abzuhören)

Da wir der Instanz keinen Namen geben, scheint es für diejenigen, die neugierig auf den Namen der Instanz sind, der von %I im Dienst angegeben wird, die Instanznummer minus eins zu sein (dh die erste Instanz hat die 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. So verwalten Sie Systemd-Dienste mit Systemctl unter Linux

  2. So konfigurieren Sie Netzwerkeinstellungen mit Ansible-Systemrollen

  3. So erstellen Sie einen Systemd-Dienst unter Linux

  4. Linux – Wie führe ich ein Skript mit Systemd direkt vor dem Herunterfahren aus?

  5. Linux – Wie bekommt man mit Systemd weniger Ttys?

So führen Sie Container als Systemd-Dienst mit Podman aus

So führen Sie Shell-Skript als Systemd-Dienst in Linux aus

Verwalten von cgroups mit systemd

So richten Sie die automatische Ausführung eines Python-Skripts mit Systemd ein

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

Wie erstelle ich ein Konfigurationsskript?