【问题标题】:How to Pipe Output to a File When Running as a Systemd Service?作为 Systemd 服务运行时如何将输出通过管道传输到文件?
【发布时间】:2018-02-22 15:57:04
【问题描述】:

在将程序作为 systemd 服务运行时,我无法通过管道将 STDOUT 和 STDERR 传输到文件。我尝试将以下内容添加到 .service 文件中:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: linux stdout fedora systemd stderr


    【解决方案1】:

    systemd.service(5) 说:

    执行开始=

    在此服务启动时执行的带有参数的命令。

    所以,systemd 使用参数 >/filepath/filename2>&1 运行您的 /apppath/appname

    试试:

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

    【讨论】:

    • 谢谢。这有所帮助,但我遇到的根本问题是 SELinux 静默阻止写入我尝试使用的日志文件夹。
    • 有些人可能希望将第一个 > 替换为 >> 以附加到日志文件中。
    • 请注意 - 这将产生两个进程,一个用于 shell 包装器,一个用于 appname。要使用“systemctl stop appname”终止这两个进程,请在 ExecStop 中使用 pkill。 ExecStop=/bin/pkill -TERM -P $MAILPID
    • 您可以使用exec将shell替换为目标进程。通过使用它,您将摆脱使用 KillMode 或其他方式杀死 2 个 proc 的需要。 ExecStart=/bin/bash -c 'exec /usr/local/bin/service &>> /var/log/service.log'
    【解决方案2】:

    试试:

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

    ExecStart 要求第一个参数是二进制文件(没有例外),并且不允许管道或重定向。因此,使用 ExecStart 启动一个 shell,您可以在其中执行所有需要的花哨的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多