GNU/Linux >> Znalost Linux >  >> Linux

Jak nakonfigurovat Systemd tak, aby jednoduchý skript pomocí Standardio převedl do síťové služby?

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

Linux
  1. Jak vytvořit službu Systemd v Linuxu

  2. Linux – Jak spustit skript pomocí Systemd těsně před vypnutím?

  3. Linux – jak získat méně Ttys s Systemd?

  1. CentOS / RHEL 7 :Jak nakonfigurovat sériové getty pomocí systemd

  2. Jak mohu nakonfigurovat službu systemd, aby se pravidelně restartovala?

  3. Jak spustím skript před vším ostatním při vypnutí pomocí systemd?

  1. Jak nakonfigurovat nastavení sítě pomocí systémových rolí Ansible

  2. Jak napsat spouštěcí skript pro Systemd?

  3. Jak zastavit službu systemd