我创建了以下 systemd 服务:
[Unit]
Description=ISPConfig DC Sync
After=network.target
After=mysql.service
After=nginx.service
[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/ispconfig/server/server.sh
[Install]
WantedBy=multi-user.target
(.sh) 命令有一个循环,它返回一条消息,说明它是出错了还是成功了。问题是这个结果会打印在消息 (/var/log/messages) 日志中。有办法防止这种情况发生吗?(最好是在自己的服务的规范中)
答案1
这文档您可以将状态设置StandardOutput=
为StandardError=
您想要的任何值。它们默认为日志,但您可以将它们重定向到多个位置中的任意一个。
控制执行进程的文件描述符 1 ( STDOUT) 连接到何处。可采用、
inherit
、null
、tty
、journal
、syslog
、kmsg
、journal+console
、syslog+console
、kmsg+console
、file:path
或append:path
之一。truncate:path
socket
fd
...
null
将标准输出连接到/dev/null
,即写入其中的所有内容都将丢失。
StandardError=
类似,但有一个重要例外inherit
(也是默认情况):
控制执行进程的文件描述符 2 (STDERR) 连接到的位置。可用选项与 的选项相同
StandardOutput=
,但有一些例外:如果设置为 ,则inherit
用于标准输出的文件描述符将重复用于标准错误,而fd
对错误流进行操作,并且默认情况下将查找名为 的描述符"stderr"
。
因此,你可以这样做:
[Service]
StandardOutput=null
StandardError=journal
但请记住,您将丢失脚本的输出;更重要的是,如果出现问题,并且脚本在标准输出上输出错误而不是标准错误(许多 shell 脚本都是这样),您也会丢失它。当出现问题时,这会给您带来很多不必要的挫败感。
因此,您实际上不应该对 systemd 单元执行任何操作。相反,如果您不希望脚本在成功时输出任何内容,请修复该脚本。