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を設定します。
ハートビート.ソケット:
[Unit]
Description=Socket pour le demon heartbeat
PartOf=heartbeat.service
[Socket]
ListenStream=0.0.0.0:6666
Accept=true
[Install]
WantedBy=sockets.target
ハートビート・サービス:
[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
答え1
heartbeat.serviceの名前変更[Eメール保護]作業が完了しました。
答えはsystemd.socketのマンページにあります(一度だけで十分でない場合はRTFMを2回...)。
各ソケットファイルには、ソケットの着信トラフィックから開始されるサービスを記述する一致するサービスファイルが必要です(.serviceファイルの詳細については、systemd.service(5)を参照)。 .service ユニットの名前は、デフォルトで .socket ユニットと同じ名前で指定されますが、後述の Service= オプションを使用して変更できます。後述の Accept= オプションの設定に応じて、この .service 単位は .socket 単位のように名前を付ける必要がありますが、Service= でオーバーライドされない限り、サフィックスを置き換える必要があります。または、同じ方法で名前が付けられたテンプレート単位でなければなりません。例:Accept = falseが設定されている場合、ソケットファイルfoo.socketには一致するサービスfoo.serviceが必要です。Accept=true に設定した場合のサービステンプレートファイル[Eメール保護]着信接続ごとにサービスをインスタンス化するには、存在する必要があります。
したがって、サービスはsystemdによってインスタンス化され、ソケットデバイスによってトリガーされるため、開始する必要はありません(受信接続をtcpポートで受信するにはサービスを開始する必要があります)。
インスタンス名が指定されていないため、サービスで%Iで指定されたインスタンス名が気になる人のためにインスタンス番号から1を引いたように見えます(つまり、最初のインスタンスのIDは0です)。
[root@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.
[root@Chalet ~]# ncat 127.0.0.1 6666
what is %I in the service ?
^C
[root@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: 6; Connected: 6
mai 15 15:25:03 Chalet systemd[1]: Listening on Socket pour le demon heartbeat.
[root@Chalet ~]# 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).