GNU/Linux >> Linux の 問題 >  >> Linux

ネットワークサービスでStandardioを使用して単純なスクリプトを作成するようにSystemdを構成するにはどうすればよいですか?

tcpポート6666でリッスンしているネットワークサービスとしてbashスクリプトを設定しようとしています。しかし、起動時にサービスが失敗し、このエラーが発生します:

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

このメッセージ「heartbeat.service:複数のソケットを取得しました」の意味がわかりません。どこが間違っているのか理解するのを手伝ってもらえますか?

私はこのようにsystemdを設定しました:

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

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

承認された回答:

heartbeat.serviceの名前を[メールで保護]に変更すると、うまくいきました。

答えは単にsystemd.socketのマンページにありました(1つでは不十分な場合はRTFMを2回…):

ソケットファイルごとに、ソケットの着信トラフィックで開始するサービスを記述した、一致するサービスファイルが存在する必要があります(.serviceファイルの詳細については、systemd.service(5)を参照してください)。 .serviceユニットの名前は、デフォルトでは.socketユニットの名前と同じですが、以下で説明するService=オプションを使用して変更できます。以下で説明するAccept=オプションの設定に応じて、この.serviceユニットは、.socketユニットと同じ名前にする必要がありますが、Service =でオーバーライドしない限り、サフィックスを置き換えます。または、同じ名前のテンプレートユニットである必要があります。例:Accept =falseが設定されている場合、ソケットファイルfoo.socketには一致するサービスfoo.serviceが必要です。 Accept =trueが設定されている場合、着信接続ごとにサービスがインスタンス化されるサービステンプレートファイル[メール保護]が存在する必要があります。

その結果、彼はsystemdによってインスタンス化され、ソケットユニットによってトリガーされるため、サービスを開始する必要はありません(着信接続について、tcpポートをリッスンするために開始する必要があります)

インスタンスに名前を付けていないので、サービスで%Iによって指定されたインスタンスの名前に興味がある人にとっては、インスタンス番号から1を引いたもののようです(つまり、最初のインスタンスの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. Linux –シャットダウン直前にsystemdでスクリプトを実行する方法は?

  2. Linux – SystemdでTtyを減らす方法は?

  3. CentOS / RHEL 7 :systemd でシリアル getty を構成する方法

  1. systemd サービスを定期的に再起動するように設定するにはどうすればよいですか?

  2. systemd でのシャットダウン時に、他のすべての前にスクリプトを実行するにはどうすればよいですか?

  3. シャットダウン直前にsystemdでスクリプトを実行する方法は?

  1. LinuxでSystemctlを使用してSystemdサービスを管理する方法

  2. Ansibleシステムロールを使用してネットワーク設定を構成する方法

  3. LinuxでSystemdサービスを作成する方法