次の socat コマンドラインは、シェルプロンプトで入力したときに期待どおりに機能します。
# /usr/bin/socat UDP-RECV:4321 STDOUT
UDPポート4321で待機し、受信したすべてを標準出力に書き込みます。
以下は、systemdジャーナル(サービスの標準出力のデフォルトの宛先)に受信したデータを書き込むことを目的として、このコマンドをsystemdサービスとして開始する試みです。
# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT
ただし、このサービスが開始されるとすぐにsocatが終了します。
Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)
問題を調査(socat
を-d -d -d -d
で実行)すると、標準出力にEOF)が返されます。
N starting data transfer loop with FDs [5,5] and [1,1]
N socket 2 (fd 1) is at EOF
I close(5)
N exiting with status 0
Systemdサービスとしてsocat
を使用することは可能ですか?
この問題は、デフォルトでsocat
が双方向であるためです。 /dev/null
である標準入力を読み取ろうとし、EOFを取得して終了します。
解決策は-u
オプションを使用することです:
ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT
これは、socatにUDP-RECV:4321
からSTDOUT
への一方向で実行するように指示します。