Snažím se nastavit bash skript jako síťovou službu naslouchající na tcp portu 6666. Ale služba selže při spuštění s těmito chybami:
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'.
Nerozumím tomu, co znamená tato zpráva „heartbeat.service:Got more than one socket“. Můžete mi pomoci pochopit, kde dělám chybu?
Systemd jsem nakonfiguroval takto:
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 je:
#!/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
Přijatá odpověď:
Přejmenování heartbeat.service [email protected] to zvládlo.
Odpověď byla jednoduše v manuálové stránce systemd.socket (RTFM dvakrát, pokud jedna nestačí…) :
Pro každý soubor soketu musí existovat odpovídající soubor služby popisující službu, která se má spustit při příchozím provozu na soketu (další informace o souborech .service najdete v systemd.service(5). Název jednotky .service je standardně stejný jako název jednotky .socket, ale lze jej změnit pomocí níže popsané možnosti Service=. V závislosti na nastavení možnosti Accept=popsané níže musí být tato jednotka .service buď pojmenována jako jednotka .socket, ale s nahrazenou příponou, pokud není přepsána pomocí Service=; nebo to musí být jednotka šablony pojmenovaná stejným způsobem. Příklad:soubor soketu foo.socket potřebuje odpovídající službu foo.service, pokud je nastaveno Accept=false. Pokud je nastavena možnost Accept=true, musí existovat soubor šablony služby [chráněný e-mailem], ze kterého se vytvoří instance služeb pro každé příchozí připojení.
V důsledku toho se služba nemusí spouštět, protože je instancí systemd a spouštěna zásuvkovou jednotkou (která musí být spuštěna, aby naslouchala tcp portu pro příchozí připojení)
Protože instanci nedáváme žádné jméno, pro ty, kteří by byli zvědaví na název instance dané službou %I, se zdá, že je to číslo instance mínus jedna (tj. první instance má 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).