Редактирование файла на месте с помощью SED, по-видимому, предотвращает любые дальнейшие операции добавления процессами, которые уже запущены
У меня есть файл журнала, который записывается сервером. Я написал скрипт bash для отправки мне электронного письма, если на сервере произошла ошибка. Теперь я хотел бы удалить строки, содержащие ошибки, чтобы я не продолжал получать электронные письма. Я выполняю это, выполняя следующее:
sed -i "/WARNING/d" logs/console.log
Однако после запуска sed в журнал больше не вносятся изменения. Я предполагаю, что это потому, что запуск sed закрывает любые открытые дескрипторы файлов или что-то в этом роде. Однако, когда я редактирую файл и вручную удаляю строки предупреждений с помощью vi, у меня не возникает этой проблемы.
Я также попытался перенаправить вывод сервера самостоятельно с помощью операторов ">" и ">>", и после редактирования файла с помощью sed происходит то же самое (то есть они больше не обновляются).
1 ответ
Когда sed
переписывает файл журнала, серверный процесс, вероятно, получает ошибку ввода-вывода и не пытается повторно открыть файл журнала. Я не знаю, может ли этот подход сработать. 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
Этот скрипт просто для того, чтобы дать вам представление, его можно улучшить.