Редактирование файла на месте с помощью 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

Этот скрипт просто для того, чтобы дать вам представление, его можно улучшить.

Другие вопросы по тегам