web-dev-qa-db-ja.com

socatはsystemdから直接起動できますか?

次の 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を使用することは可能ですか?

7
starfry

この問題は、デフォルトでsocatが双方向であるためです。 /dev/nullである標準入力を読み取ろうとし、EOFを取得して終了します。

解決策は-uオプションを使用することです:

ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT

これは、socatにUDP-RECV:4321からSTDOUTへの一方向で実行するように指示します。

7
starfry