StandardInput=ソケットサービスの実行に失敗しました

StandardInput=ソケットサービスの実行に失敗しました

サービスがソケットの標準入力に依存する単純なソケット/サービスペアがあります。

# /etc/systemd/system/simple.socket
[Unit]
Description=Simple socket

[Socket]
ListenStream=11111
# /etc/systemd/system/simple.service
[Unit]
Description=Simple service

[Service]
Type=simple
ExecStart=-cat -
StandardInput=socket
StandardOutput=socket

起動しようとすると、次の結果netcat 127.0.0.1 11111が表示されます。

- simple.service - "Simple service"
     Loaded: loaded (/etc/systemd/system/simple.service; vendor preset: enabled)
     Active: failed (Result: start-limit-hit) since Tue 2020-05-19 09:42:17 CEST; 11min ago
TriggeredBy: simple.socket
    Process: 400879 ExecStart=/bin/cat - (code=exited, status=1/FAILURE)
   Main PID: 400879 (code=exited, status=1/FAILURE)

- simple.socket - "Simple socket"
     Loaded: loaded (/etc/systemd/system/simple.socket; static; vendor preset: enabled)
     Active: failed (Result: service-start-limit-hit) since Tue 2020-05-19 09:42:17 CEST; 11min ago
   Triggers: simple.service
     Listen: [::]:11111 (Stream)

私の考えでは、利用できない接続catに接続しようとしたため起動しないようです。サービスとstdin交換すると正常に起動します。なぜかわかりません。cat -sleep infinity

答え1

Accept=解決策はソケットオプションに関連しています。

このバージョンは動作します:

# /etc/systemd/system/simple.socket
[Unit]
Description=Simple socket

[Socket]
Accept=yes
ListenStream=11111

新しいファイルパスを書き留めます。

# /etc/systemd/system/[email protected]
[Unit]
Description=Simple service

[Service]
Type=simple
ExecStart=-cat -
StandardInput=socket
StandardOutput=socket

これnc 127.0.0.1 11111で返されないので、送信するすべてのコンテンツをエコーできます。これで以下もsystemctl status simple*提供されます。

- simple.socket - Simple socket
     Loaded: loaded /etc/systemd/system/simple.socket; static: vendor preset: enabled)
     Active: active (listening) since Tue 2020-05-19 10:04:48 CEST; 48s ago
   Triggers: [email protected]:11111-127.0.0.1:47194.service
     Listen: [::]:11111 (Stream)
   Accepted: 2; Connected: 1;
      Tasks: 0 (limit: 9429)
     Memory: 120.0K
     CGroup: /system.slice/simple.socket

- [email protected]:11111-127.0.0.1:47194.service - "Simple service" (127.0.0.1:47194)
     Loaded: loaded /etc/systemd/system/[email protected]; static: vendor preset: enabled)
     Active: active (running) since Tue 2020-05-19 10:04:48 CEST; 48s ago
TriggeredBy: simple.socket
   Main PID: 403830 (cat)
      Tasks: 1 (limit: 9429)
     Memory: 184.0K
     CGroup: /system.slice/system-simple.slice/[email protected]:11111-127.0.0.1:47194.service
             -403830 /bin/cat -

私はこれがうまくいくと思います。当時Accept=no、各接続は同じプロセスに接続しようとし、複数のソケットを単一の標準入力に多重化しようとするのが少し奇妙だからです。各Accept=yes接続は新しいプロセスを生成するので、ソケットを各プロセスの標準入力にパイプすることは簡単です。

関連情報