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