如何作为系统服务运行时将输出管道传输到文件?

Mic*_*B76 32 linux stdout fedora stderr systemd

在将程序作为systemd服务运行时,我无法将STDOUT和STDERR传送到文件.我已经尝试将以下内容添加到.service文件中:

ExecStart=/apppath/appname > /filepath/filename 2>&1
Run Code Online (Sandbox Code Playgroud)

但这不起作用.输出结果在/ var/log/messages中,可以使用journalctl查看,但我想要一个单独的文件.

我也试过设置,StdOutput=tty但找不到将其重定向到文件的方法.

任何帮助,将不胜感激.

Evg*_*gin 46

systemd.service(5) 说:

ExecStart =

具有在启动此服务时执行的参数的命令.

因此,systemd运行您/apppath/appname与ARGS >,/filepath/filename,2>&1

尝试:

ExecStart=/bin/sh -c '/apppath/appname > /filepath/filename 2>&1'
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`exec`将shell替换为目标进程.通过使用它,您将摆脱使用KillMode或其他任何东西杀死2个过程的需要.`execStart =/bin/bash -c'exec/usr/local/bin/service&>>/var/log/service.log'` (14认同)
  • 有些人可能希望将第一个>替换为>>以附加到日志文件. (9认同)
  • 要注意 - 这将产生两个进程,一个用于shell包装器,另一个用于appname.要使用'systemctl stop appname'终止这两个进程,请在ExecStop中使用pkill.ExecStop =/bin/pkill -TERM -P $ MAILPID (4认同)
  • @siliconrockstar请参阅https://www.freedesktop.org/software/systemd/man/systemd.kill.html#KillMode= (2认同)

Cas*_*sey 5

尝试:

ExecStart=/usr/bin/sh -c "/apppath/appname > /filepath/filename 2>&1"
Run Code Online (Sandbox Code Playgroud)

ExecStart要求第一个参数为二进制(无例外),并且不允许管道或重定向。因此,使用ExecStart启动外壳程序,您可以在其中执行所有需要的操作。