I'm having trouble piping the STDOUT & STDERR to a file when running a program as a systemd service. I've tried adding the following to the .service
file:
ExecStart=/apppath/appname > /filepath/filename 2>&1
But this doesn't work. The output is ending up in /var/log/messages and is viewable using journalctl but I'd like a separate file.
I've also tried setting StdOutput=tty
but can't find a way of redirecting this to a file.
Any help would be appreciated.
Creating systemd unit file. You will need to create a custom service unit file under the '/etc/systemd/system/' directory because this is reserved for custom scripts. Any unit file in '/etc/systemd/system' will override the corresponding file in '/lib/systemd/system'.
Logs collected by systemd can be viewed by using journalctl. The journal is implemented with the journald daemon and it retrieves messages from the kernel, systemd services, and other sources. These logs are gathered in a central location, which makes it easy to review.
systemd.service(5)
says:
ExecStart=
Commands with their arguments that are executed when this service is started.
So, systemd
runs your /apppath/appname
with args >
, /filepath/filename
, 2>&1
Try:
ExecStart=/bin/sh -c '/apppath/appname > /filepath/filename 2>&1'
Try:
ExecStart=/usr/bin/sh -c "/apppath/appname > /filepath/filename 2>&1"
ExecStart requires the first argument to be a binary (no exceptions), and doesn't allow pipes or redirection. Therefore, use ExecStart to start a shell within which you can do all the fancy things required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With