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