1

我有一个由服务器写入的日志文件。如果服务器出现错误,我编写了一个 bash 脚本向我发送电子邮件。我现在想删除包含错误的行,这样我就不会继续收到电子邮件了。我通过执行以下操作来完成此操作:

sed -i "/WARNING/d" logs/console.log

但是,在运行 sed 之后,不会再将更改写入日志。我猜这是因为运行 sed 会关闭任何打开的文件描述符或其他东西。但是,当我编辑文件并使用 vi 手动删除警告行时,我没有这个问题。

我还尝试使用“>”和“>>”运算符自己重定向服务器输出,并在使用 sed 编辑文件后发生同样的事情(即它们不再更新)。

4

1 回答 1

1

sed重写日志文件时,服务器进程可能会收到 IO 错误并且不会尝试重新打开日志文件。我不知道这种方法是否可行。sed绝对没有标志来调整它用-i标志重写文件的方式,而且我不知道服务器是否可以调整为在附加到日志时更具弹性。

因此,您最好的选择可能是另一种方法:保存最后一个错误的时间戳,在该时间戳之后查找错误。像这样的东西:

ts=
file=console.log
while :; do
    if test "$ts"; then
        if sed -e "1,/$ts/d" $file | grep -q WARNING; then
            sed -e "1,/$ts/d" $file | sendmail ...
            ts=$(tail -n 1 $file | cut -f1 -d' ')
        fi
    else
        if grep -q WARNING $file; then
            sendmail ... < $file
            ts=$(tail -n 1 $file | cut -f1 -d' ')
        fi
    fi
    sleep 15
done

这个脚本只是给你一个想法,它可以改进。

于 2013-12-27T19:32:51.217 回答