
次のようなソカットコマンドラインは、シェルプロンプトに入力すると期待どおりに機能します。
# /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
runを使用してこの問題を調査したところ、-d -d -d -d
stdoutで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
socat
システムサービスとして使用できますか?
答え1
問題はsocat
基本的に双方向のために発生します。標準入力を読み取ろうとすると/dev/null
EOFを受け取り、終了します。
回避策は、次の-u
オプションを使用することです。
ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT
UDP-RECV:4321
これはsocatにから一方向に実行するように指示しますSTDOUT
。