GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Mengkonfigurasi Systemd Untuk Menghidupkan Script Sederhana Dengan Standardio Dalam Layanan Jaringan?

Saya mencoba menyiapkan skrip bash sebagai layanan jaringan yang mendengarkan di tcp port 6666. Tetapi layanan gagal saat memulai dengan kesalahan ini:

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

Saya tidak mengerti maksud pesan ini "heartbeat.service:Got more than one socket". Bisakah Anda membantu saya memahami di mana saya salah?

Saya mengkonfigurasi systemd seperti ini :

detak jantung.socket :

[Unit]
Description=Socket pour le demon heartbeat
PartOf=heartbeat.service

[Socket]
ListenStream=0.0.0.0:6666
Accept=true

[Install]
WantedBy=sockets.target

detak jantung.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 adalah :

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

Jawaban yang Diterima:

Mengganti nama detak jantung.service [email protected] berhasil.

Jawabannya ada di halaman manual systemd.socket (RTFM dua kali jika tidak cukup…):

Untuk setiap file soket, file layanan yang cocok harus ada, yang menjelaskan layanan untuk memulai lalu lintas masuk pada soket (lihat systemd.service(5) untuk informasi lebih lanjut tentang file .service). Nama unit .service secara default sama dengan nama unit .socket, tetapi dapat diubah dengan opsi Service=yang dijelaskan di bawah ini. Bergantung pada pengaturan opsi Accept=yang dijelaskan di bawah, unit .service ini harus dinamai seperti unit .socket, tetapi dengan akhiran yang diganti, kecuali diganti dengan Service=; atau harus berupa unit template yang dinamai dengan cara yang sama. Contoh:file soket foo.socket memerlukan layanan foo.service yang cocok jika Accept=false disetel. Jika Accept=true disetel, file template layanan [dilindungi email] harus ada dari mana layanan dibuat untuk setiap koneksi masuk.

Akibatnya layanan belum dimulai karena dia diinstansiasi oleh systemd dan dipicu oleh unit soket (yang harus dimulai untuk mendengarkan port tcp untuk koneksi masuk)

Karena kami tidak memberikan nama apa pun untuk instance, bagi mereka yang ingin tahu tentang nama instance yang diberikan oleh %I dalam layanan, tampaknya nomor instance dikurangi satu (yaitu instance pertama memiliki 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. Cara Mengelola Layanan Systemd dengan Systemctl di Linux

  2. Cara mengonfigurasi pengaturan jaringan dengan peran sistem yang memungkinkan

  3. Cara membuat layanan Systemd di Linux

  1. Linux – Bagaimana Cara Menjalankan Script Dengan Systemd Tepat Sebelum Shutdown?

  2. Linux – Bagaimana Mendapatkan Lebih Sedikit Ttys Dengan Systemd?

  3. CentOS / RHEL 7 :Cara mengkonfigurasi getty serial dengan systemd

  1. Bagaimana Cara Menulis Script Startup Untuk Systemd?

  2. Bagaimana saya bisa mengonfigurasi layanan systemd untuk memulai ulang secara berkala?

  3. Bagaimana cara menjalankan skrip dengan systemd tepat sebelum dimatikan?