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

新手上路,请多包涵

我正在尝试将 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

请纠正我的做法。

原文由 meallhour 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

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

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

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

然后,假设你的发行版使用 rsyslog 来管理 syslogs,在 /etc/rsyslog.d/<new_file>.conf 中创建一个文件,内容如下:

 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 <your program identifier> ) 获得,但它们也可在您选择的文件中获得。

来源:archive.org

原文由 Valerio Versace 发布,翻译遵循 CC BY-SA 4.0 许可协议

If you have a newer distro with a newer systemd ( systemd version 236 or newer ), you can set the values of StandardOutput or StandardErrorfile:YOUR_ABSPATH_FILENAME


很长的故事:

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

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

原文由 Trevor Boyd Smith 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏