2015-10-06 101 views
24

我在将程序作为systemd服务运行时,将STDOUT & STDERR管道传输到文件时遇到问题。我试着添加以下的.service文件:如何将输出作为系统服务运行时输出到文件?

ExecStart=/apppath/appname > /filepath/filename 2>&1 

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

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

任何帮助,将不胜感激。

回答

33

systemd.service(5)说:

ExecStart =与他们的观点,这一服务已在执行

命令。

所以,systemd运行您/apppath/appname与ARGS >/filepath/filename2>&1

尝试:

ExecStart=/bin/sh -c '/apppath/appname > /filepath/filename 2>&1' 
+0

谢谢。这有所帮助,但是我发现的底层问题与SELinux无声地阻止了对我正在尝试使用的日志文件夹的写入操作。 – MichaelB76

+9

有些人可能想用>>替换第一个>追加到日志文件。 – Zyphrax

+4

注意 - 这会产生两个进程,一个用于shell包装,另一个用于appname。要使用'systemctl stop appname'杀死这两个进程,请在ExecStop中使用pkill。 ExecStop =/bin/pkill -TERM -P $ MAILPID – siliconrockstar

1

尝试:

ExecStart=/usr/bin/sh -c "/apppath/appname > /filepath/filename 2>&1" 

ExecStart需要的第一个参数是二进制(没有例外),并且不允许管道或重定向。因此,使用ExecStart启动一个可以完成所有所需功能的shell。

相关问题