Kann socat direkt von systemd gestartet werden?

7

Die folgende socat- Befehlszeile funktioniert wie erwartet, wenn sie an einer Shell-Eingabeaufforderung eingegeben wird:

# /usr/bin/socat UDP-RECV:4321 STDOUT

Es überwacht den UDP-Port 4321 und schreibt alles, was empfangen wurde, in die Standardausgabe.

Im Folgenden wird versucht, diesen Befehl als systemd-Dienst mit der Absicht zu starten, empfangene Daten in das systemd-Journal zu schreiben (das Standardziel für die Standardausgabe eines Dienstes):

# /etc/systemd/system/socat.service
[Service]
ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT

Socat wird jedoch sofort beendet, wenn dieser Dienst gestartet wird:

Process: 7425 ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT (code=exited, status=0/SUCCESS)

Die Untersuchung des Problems (läuft socatmit -d -d -d -d) zeigt, dass es einen EOF für die Standardausgabe erhält:

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

Ist es möglich, socatals systemd-Dienst zu verwenden?

Sternenhimmel
quelle
Natürlich können Sie socatals systemd-Dienst ausgeführt werden. Nichts hindert Sie daran. Aber ich frage mich wirklich, was Sie von dem stdoutStream erwarten . Sie erwarten sicherlich nicht, dass ein Systemdienst mit einer Terminalsitzung verbunden ist, oder?
Pavel Šimerda
Ich weiß , ich kann natürlich socat als systemd - Dienst ausführen. Aber irgendetwas bewirkt, dass es beendet wird und das sieht aus wie ein EOF auf stdout. Ich erwarte auf keinen Fall, dass ein systemd-Dienst mit einer Terminalsitzung verbunden ist . Wenn Sie etwas über systemd wissen, wissen Sie, dass die Standardausgänge von Prozessen standardmäßig mit dem Journal verbunden sind ... genau wie ich in meiner Frage gesagt habe.
Sternenfrucht
Entspannen Sie sich, keine Notwendigkeit für Konfrontation. Ich sehe, dass es jetzt eine akzeptierte Antwort gibt und tatsächlich mit den Standard-Streams zusammenhängt, also nichts Unerwartetes.
Pavel Šimerda

Antworten:

7

Das Problem ist socatstandardmäßig bidirektional. Es versucht, seine Standardeingabe zu lesen /dev/null, dh es erhält einen EOF und wird beendet.

Die Lösung besteht darin, die -uOption zu verwenden:

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

Dies weist socat an, unidirektional von UDP-RECV:4321bis zu laufen STDOUT.

Sternenhimmel
quelle