发布
社区首页 >问答首页 >如何将systemd服务的输出重定向到文件

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

Stack Overflow用户
提问于 2016-06-02 07:51:46
回答 10查看 309.1K关注 0票数 262

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

代码语言:javascript
代码运行次数:0
复制
[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

请纠正我的做法。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2017-05-07 09:58:00

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

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

代码语言:javascript
代码运行次数:0
复制
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote

然后,假设您的发行版使用rsyslog来管理syslog,那么在/etc/rsyslog.d/<new_file>.conf中创建一个包含以下内容的文件:

代码语言:javascript
代码运行次数:0
复制
if $programname == '<your program identifier>' then /path/to/log/file.log
& stop

现在,让syslog可以写日志文件:

代码语言:javascript
代码运行次数:0
复制
# 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仍然可以通过日志but (sudo journalctl -u <your program identifier>)获得,但它们也可以在您选择的文件中使用。

通过archive.org的源

票数 344
EN

Stack Overflow用户

发布于 2018-01-01 18:23:26

如果您有一个更新的systemd (236或更高版本)发行版,则可以将StandardOutputStandardError的值设置为file:YOUR_ABSPATH_FILENAME

说来话长:

在较新版本的systemd中,有一个相对较新的选项(github请求从2016年ish开始,增强将合并/关闭2017年ish),可以将StandardOutputStandardError的值设置为file:YOUR_ABSPATH_FILENAMEfile:path选项记录在手册页中。

这个新特性是相对较新的,因此不适用于像centos-7这样的旧发行版(或之前的任何centos )。

票数 122
EN

Stack Overflow用户

发布于 2019-01-17 09:16:53

我建议将stdoutstderr文件添加到systemd service文件本身中。

推荐:https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

正如您已经配置的那样,它不应该喜欢:

代码语言:javascript
代码运行次数:0
复制
StandardOutput=/home/user/log1.log
StandardError=/home/user/log2.log

它应该是:

代码语言:javascript
代码运行次数:0
复制
StandardOutput=file:/home/user/log1.log
StandardError=file:/home/user/log2.log

当您不想一次又一次地重新启动服务时,这是可行的。

--这将创建一个新文件,而不追加到现有的文件中.

改为使用:

代码语言:javascript
代码运行次数:0
复制
StandardOutput=append:/home/user/log1.log
StandardError=append:/home/user/log2.log

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

票数 103
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37585758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档