システムソケット起動標準入力

システムソケット起動標準入力

以前のxinetd構成をsystemdに転送する必要があります。要件は、TCPポートを開いて着信転送をリッスンすることです。アプリケーションは、ファイルをポートにネットワーキングすることによって、接続ごとに1つのファイルを転送できます。転送が登録されると、stdinをファイルにリダイレクトして、着信データをファイルに保存するシェルスクリプトが呼び出されます。この構造は長年 xined で働いてきました。これが私が持っているものです:

[root@localhost ~]# cat /etc/systemd/system/foo.socket
[Unit]
Description=Foo Socket
PartOf=foo.service

[Socket]
ListenStream=127.0.0.1:9999
Accept=yes

[Install]
WantedBy=sockets.target
[root@localhost ~]# cat /etc/systemd/system/[email protected]
[Unit]
Description=Foo Service
After=network.target foo.socket
Requires=foo.socket

[Service]
Type=simple
ExecStart=/usr/local/bin/foo.sh
TimeoutStopSec=5

[Install]
WantedBy=default.target
[root@localhost ~]# cat /usr/local/bin/foo.sh
#!/bin/bash

cat > /tmp/foo.$$
[root@localhost ~]# systemctl start foo.socket
[root@localhost ~]# echo "Hello World" > testfile
[root@localhost ~]# socat -u FILE:testfile TCP:127.0.0.1:9999
[root@localhost ~]# ls -al /tmp/foo.*
-rw-r--r--. 1 root root 0 Nov  7 21:20 /tmp/foo.19820
[root@localhost ~]#

tcp ポートが開き、サービスが呼び出され、シェルスクリプトが実行されます。ただし、出力ファイルサイズは0です。ソケットを停止して次のコマンドを使用する場合:

[root@localhost system]# systemctl stop foo.socket
[root@localhost system]# /usr/lib/systemd/systemd-activate -l 127.0.0.1:9999 -a /usr/local/bin/foo.sh &
[1] 19833
[root@localhost system]# Listening on 127.0.0.1:9999 as 3.
[root@localhost ~]# socat -u FILE:testfile TCP:127.0.0.1:9999
Communication attempt on fd 3.
Connection from 127.0.0.1:39924 to 127.0.0.1:9999
Spawned /usr/local/bin/foo.sh (/usr/local/bin/foo.sh) as PID 19840
[root@localhost ~]# Child 19840 died with code 0
[root@localhost ~]# ls -al /tmp/foo*
-rw-r--r--. 1 root root   12 Nov  7 21:26 /tmp/foo.19840
[root@localhost ~]# cat /tmp/foo.19840
Hello World
[root@localhost ~]#

期待どおりに動作します。私は何を見逃していますか?

ベストアンサー1

知っていた。サービス単位ファイルには、ソケットのデータを受け入れるにはStandardInput = socketオプションが必要です。完全なファイルは次のようにする必要があります。

# cat /etc/systemd/system/[email protected] 
[Unit]
Description=Foo Service
After=network.target foo.socket
Requires=foo.socket

[Service]
Type=simple
ExecStart=/usr/local/bin/foo.sh
TimeoutStopSec=5
StandardInput=socket

[Install]
WantedBy=default.target

おすすめ記事