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?


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.