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 socat
mit -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, socat
als systemd-Dienst zu verwenden?
socat
als systemd-Dienst ausgeführt werden. Nichts hindert Sie daran. Aber ich frage mich wirklich, was Sie von demstdout
Stream erwarten . Sie erwarten sicherlich nicht, dass ein Systemdienst mit einer Terminalsitzung verbunden ist, oder?Antworten:
Das Problem ist
socat
standardmäß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
-u
Option zu verwenden:Dies weist socat an, unidirektional von
UDP-RECV:4321
bis zu laufenSTDOUT
.quelle