如何使 systemd 服务静音?

Dio*_*aga 5 centos systemd

我创建了以下 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
Run Code Online (Sandbox Code Playgroud)

(.sh) 命令有一个循环,它返回一条消息,说明它是否有错误或成功。问题是这个结果打印在消息 (/var/log/messages) 日志中。有没有办法防止这种情况?(最好在自己服务的规范中)

Mic*_*ton 15

文档说明您可以设置StandardOutput=并设置StandardError=为您想要的任何内容。它们默认为日志,但您可以将它们重定向到多个位置中的任何一个。

控制已执行进程的文件描述符 1 (STDOUT) 连接到的位置。采用inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console,socket或 之一fd

...

null将标准输出连接到/dev/null,即写入其中的所有内容都将丢失。

StandardError=是类似的,但它inherit的方式有一个重要的例外(这也是默认值):

控制已执行进程的文件描述符 2 (STDERR) 连接到的位置。可用选项与 的相同,但StandardOutput=有一些例外:如果设置为inherit用于标准输出的文件描述符,则为标准错误复制,而fd在错误流上操作,默认情况下将查找名为 的描述符"stderr"

所以,你可以这样做:

[Service]
StandardOutput=null
StandardError=journal
Run Code Online (Sandbox Code Playgroud)

但请记住,您将丢失脚本的输出;更重要的是,如果出现问题并且脚本在标准输出上输出错误而不是标准错误(正如许多 shell 脚本所做的那样),您也会丢失它。当出现问题时,这会给你带来很多不必要的挫败感。

所以,你真的不应该对 systemd 单元做任何事情。相反,如果您不希望脚本在成功时输出任何内容,请修复脚本。