我试图将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
请纠正我的做法。
发布于 2017-05-07 01:58:00
我认为有一种更优雅的方法来解决这个问题:将stdout/stderr发送到带有标识符的syslog,并指示syslog管理器将其输出按程序名拆分。
在systemd服务单元文件中使用以下属性:
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote
然后,假设您的发行版使用rsyslog来管理syslog,那么在/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仍然可以通过日志but (sudo journalctl -u <your program identifier>
)获得,但它们也可以在您选择的文件中使用。
发布于 2018-01-01 10:23:26
如果您有一个更新的systemd
(236或更高版本)发行版,则可以将StandardOutput
或StandardError
的值设置为file:YOUR_ABSPATH_FILENAME
。
说来话长:
在较新版本的systemd
中,有一个相对较新的选项(github请求从2016年ish开始,增强将合并/关闭2017年ish),可以将StandardOutput
或StandardError
的值设置为file:YOUR_ABSPATH_FILENAME
。file:path
选项记录在手册页中。
这个新特性是相对较新的,因此不适用于像centos-7这样的旧发行版(或之前的任何centos )。
发布于 2019-01-17 01:16:53
我建议将stdout
和stderr
文件添加到systemd service
文件本身中。
推荐: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
注意:确保您已经创建了目录。我想它不支持创建目录。
https://stackoverflow.com/questions/37585758
复制相似问题