Am 2015-07-27 12:31, schrieb John Lane:
I have a problem with what I thought would be a simple service unit:# /etc/systemd/system/socat.service [Service] ExecStart=/usr/bin/socat UDP-RECV:4321 STDOUT The expected outcome is that "/usr/bin/socat UDP-RECV:4321 STDOUT" is started with its standard output connected to the journal.However, the service terminates immediately without error. I've lookedinto it and notice that socat is getting an EOF on FD#1, its standard output, and it then terminates: 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 The command-line given in "ExecStart" works as expected if given on a command-line.
systemd opens sockets that connect the stdout/stderr of a service to journald, but those sockets are unidirectional. This means that one cannot read from those file descriptors. But socat by default uses a bidirectional mode, and because it gets EOF when trying to read STDOUT, it will immediately terminate. Use the -u option to make socat work unidirectionally, then it should work: ExecStart=/usr/bin/socat -u UDP-RECV:4321 STDOUT (See the man page of socat for further details.) If you try it on the command line, the terminal you are using can in fact be opened for writing, so it will not get an EOF there (but you can use Ctrl+D when calling it manually to simulate that condition). Christian _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
