当前位置: 首页 > 知识库问答 >
问题:

如何将 systemd 服务的输出重定向到文件

从建明
2023-03-14

我试图将systemd服务的输出重定向到一个文件,但似乎不起作用:

[Unit]
Description=customprocess
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server
StandardOutput=/var/log1.log
StandardError=/var/log2.log
Restart=always

[Install]
WantedBy=multi-user.target

请纠正我的做法。

共有3个答案

姚建树
2023-03-14

我建议在systemd服务文件本身中添加标准输出stderr

参考:https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

按照您的配置,它应该不像:

StandardOutput=/home/user/log1.log
StandardError=/home/user/log2.log

它应该是:

StandardOutput=file:/home/user/log1.log
StandardError=file:/home/user/log2.log

当您不想一次又一次地重新启动服务时,这种方法就可以工作。

这将创建一个新文件,并且不会附加到现有文件中。

改为使用:

StandardOutput=append:/home/user/log1.log
StandardError=append:/home/user/log2.log

注意:确保您已经创建了目录。我猜它不支持创建目录。

屠德宇
2023-03-14
匿名用户

如果您有较新的< code>systemd发行版(< code>systemd版本236或更高版本),您可以将< code>StandardOutput或< code>StandardError的值设置为< code > file:YOUR _ ABSPATH _ FILENAME 。

说来话长:

在较新版本的 systemd 中,有一个相对较新的选项(github 请求来自 2016 ish,增强功能在 2017 ish 中合并/关闭),您可以在其中将 StandardOutputStandardError 的值设置为 file:YOUR_ABSPATH_FILENAMEfile:path 选项记录在最新的 systemd.exec 手册页中。

这个新功能相对较新,因此不适用于旧发行版,如centos-7(或之前的任何centos)。

高奇
2023-03-14

我认为有一种更好的方法来解决这个问题:将带有标识符的stdout/stderr发送到syslog,并指示您的syslog管理器按照程序名分割其输出。

在systemd服务单元文件中使用以下属性:

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote

然后,假设您的发行版使用 rsyslog 来管理系统日志,请在 /etc/rsyslog.d/ 中创建一个文件。

if $programname == '<your program identifier>' then /path/to/log/file.log
& stop

现在使日志文件可由syslog写入:

# ls -alth /var/log/syslog 
-rw-r----- 1 syslog adm 439K Mar  5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log

重新启动 rsyslog (sudo systemctl restart rsyslog) 并享受!您的程序 stdout/stderr 仍可通过 journalctl (sudo journalctl -u) 获得

来源通过archive.org

 类似资料:
  • 问题内容: 我正在尝试将服务的输出重定向到文件,但它似乎不起作用: 请更正我的方法。 问题答案: 我认为有一种解决问题的更优雅的方法:将stdout / stderr发送给具有标识符的syslog,并指示syslog管理器按程序名称拆分其输出。 在您的systemd服务单元文件中使用以下属性: 然后,假设您的发行版正在使用rsyslog管理syslog,请在其中创建一个包含以下内容的文件: 现在,

  • 问题内容: 在bash中,调用将在stdout上显示该命令的任何输出。 调用会将该命令的任何输出重定向到指定的文件(在本例中为“输出”)。 有没有一种方法可以将输出重定向到文件 并 在stdout上显示? 问题答案: 您想要的命令名为 : 例如,如果您只关心标准输出: 如果要包括stderr,请执行以下操作: 将通道2(stderr /标准错误)重定向到通道1(stdout /标准输出),以便将两

  • 问题内容: 我正在AIX 6上工作,在KIX Shell上运行Java命令,并且正在尝试调试类加载问题。我放了-verbose:class来打印加载的类,然后>> / home / user / log.log将控制台放到一个文件中。已创建log.log文件,但其大小为零。文件不包含任何信息,所有详细信息都在一闪而过。 问题答案: 也尝试重定向: 您的Java代码可能正在编写您的命令未重定向的信息

  • 问题内容: 我C编码的一个基本的壳,用于执行基本命令它会执行命令,,等。 我想在我的外壳中执行以下命令。喜欢 ; 这将给我包含过程输出的文件。我找到了一个解决方案,它正在像这样更改shell中的命令。在这种情况下,它将更改为。但是此过程会将输出也提供给文件和终端。如何在终端中停止打印输出。 还是有比使用tee命令更好的解决方案。提前致谢… 问题答案: 这是我用dup2测试的结果 更微妙的一点是在正

  • 问题内容: 我知道在Linux中,要将输出从屏幕重定向到文件,可以使用或。但是,我不确定为什么部分输出仍会输出到屏幕上而不写入文件。 有没有办法将所有输出重定向到文件? 问题答案: 该部分已写入stderr,用于重定向它。例如: 或者,如果您要在同一文件中: 注意:这在(ba)sh中有效,请检查您的shell语法是否正确

  • 问题内容: 我想使用python将打印重定向到.txt文件。我有一个“ for”循环,当我要将所有这些输出重定向到一个文件时,它将“打印”每个文件的输出。所以我试着把 在我的脚本的开头。但是,.txt文件中什么也没有。我的脚本是: 所以有什么问题?除了此sys.stdout以外,还有其他方法吗? 我需要我的结果看起来像: 问题答案: 最明显的方法是打印到文件对象: 但是,重定向标准输出对我也有效。