如何防止服务脚本输出阻塞 "messages"

How to keep service script output from clogging up "messages"

我在 Centos7 上有一个服务,它在 /usr/local/sbin/restarthelp2.sh 中运行一个脚本,并通过检查网络连接的状态来输出隧道检查。其输出以 /var/log/messages 结束,并使文件变得巨大。我已经将输出发送到它自己的日志文件中,如何将 script/service 的输出结果保存在 "messages" 文件中?

[Unit] 
Description=CHECK the wlan

[Service]
Type=simple
ExecStart=/usr/local/sbin/restarthelp2.sh


[Install]
WantedBy=default.target

上述脚本的代码:

#!/bin/bash

while true;
do
    status=$(</sys/class/net/wlan0/operstate)
    tunstate=$(</sys/class/net/tun0/carrier)
    now=$(date)
    if [ $status == up ] && [ $tunstate -eq 1 ];
    then
        echo "everything was good at $now, tunnel status was $tunstate" >> /var/log/wlancheck.log
        echo "tunnel status is UP"
        sleep 10
    fi
done

您可以在单元的 [Service] 部分添加行

StandardOutput=null

这样这个输出就不会记录到日志中,也不会从那里记录到系统日志中。 对于其他值,请参见 man systemd.exec


如果您正在使用 rsyslogd,您可以稍后过滤消息,就在它们被放入 /var/log/messages 之前。删除上面的 Unit 行以恢复正常记录。寻找像 /etc/rsyslog.conf 这样的文件和像

这样的行
*.info;...   /var/log/messages

在这一行的前面添加一个 filter 来比较 属性 和你想要抑制的内容,然后使用操作 stop,例如以下之一:

if $programname startswith "restarthelp" then stop
if $msg contains 'tunnel status is UP' then stop

有大量的 rsyslog 文档,但是很难理解,因为仍然支持许多旧格式,因此您必须小心不要混淆它们。

如果您还将单位 StandardOutput=null 更改为 StandardOutput=syslog,您将不再在 systemd 日志中记录消息,它们将直接进入 rsyslogd。我不知道这是否会为您提供您想要的状态信息。