Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用SED就地编辑文件似乎可以防止已经运行的进程执行任何进一步的追加操作_Unix_File Io_Sed_In Place - Fatal编程技术网

Unix 使用SED就地编辑文件似乎可以防止已经运行的进程执行任何进一步的追加操作

Unix 使用SED就地编辑文件似乎可以防止已经运行的进程执行任何进一步的追加操作,unix,file-io,sed,in-place,Unix,File Io,Sed,In Place,我有一个由服务器写入的日志文件。我编写了一个bash脚本,以便在服务器出现错误时向我发送电子邮件。我现在想删除包含错误的行,这样我就不会一直收到电子邮件。我通过执行以下操作来实现这一点: sed -i "/WARNING/d" logs/console.log 但是,在运行sed之后,不会再向日志写入任何更改。我猜这是因为运行sed会关闭任何打开的文件描述符之类的东西。但是,当我编辑文件并用vi手动删除警告行时,我没有这个问题 我也尝试过自己用'>'和'>>'操作符重定向服务器输出,在用sed

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

sed -i "/WARNING/d" logs/console.log
但是,在运行sed之后,不会再向日志写入任何更改。我猜这是因为运行sed会关闭任何打开的文件描述符之类的东西。但是,当我编辑文件并用vi手动删除警告行时,我没有这个问题


我也尝试过自己用'>'和'>>'操作符重定向服务器输出,在用sed编辑文件后,同样的事情发生了(即,它们不再更新)

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
ts=
file=console.log
while:;做
如果测试“$ts”;然后
如果sed-e“1,/$ts/d”$file | grep-q警告;然后
sed-e“1,/$ts/d”$file | sendmail。。。
ts=$(tail-n1$文件| cut-f1-d'')
fi
其他的
如果grep-q警告$file;然后
发送邮件…<$文件
ts=$(tail-n1$文件| cut-f1-d'')
fi
fi
睡眠15
完成
这个脚本只是给你一个想法,它可以改进