2011-01-11 3 views
8

я хочу лог-файл с хвостовым Grep и послал его по почте как:хвост и журнал Grep и почты (Linux)

tail -f /var/log/foo.log | grep error | mail -s subject [email protected] 

, как я могу это сделать?

+0

Этот вопрос подобен «У меня есть» print ('Foo'); 'и я хочу, чтобы он печатал« Foo ». Как мне это сделать?» Что именно * * ваш вопрос? –

+1

Вы, вероятно, не хотите 'tail' * -f *, поскольку это будет непрерывно следовать за дном файла. 'grep' тоже не ** tail ** logs. В чем проблема, которую вы пытаетесь решить? – Johnsyweb

+0

'tail -f .. | grep ... '- выводить добавленные данные по мере роста файла и с использованием grep, он печатает только строки добавления, которые соответствуют только – ajreal

ответ

2

У меня все получится. Возможно, я кое-что узнаю, если мой код нечеткого bash будет тщательно изучен. Есть шанс, что уже есть решения для этого, но я не собираюсь это выяснять, так как я уверен, что вы преодолели глубину и ширину кибероника. Похоже, что то, что вы хотите, можно разделить на два бита: 1) через равные промежутки времени получить «последний хвост» файла, 2) если последний хвост действительно существует, отправьте его по электронной почте. Для регулярных интервалов в 1) используйте cron. Для получения последнего хвоста в 2) вам нужно будет отслеживать размер файла. Сценарий bash ниже делает это - это решение для 2), которое может быть вызвано cron. Он использует размер кешированного файла, чтобы вычислить кусок файла, который ему нужно отправить по почте. Обратите внимание, что для файла myfile создается файл .offset.myfile. Кроме того, сценарий не позволяет компонентам пути в имени файла. Перепишите или исправьте его в вызове [например. (cd/foo/bar & & segtail.sh zut), предполагая, что это называется segtail.sh].

#!/usr/local/bin/bash 
file=$1 
size=0 
offset=0 
if [[ $file =~/]]; then 
    echo "$0 does not accept path components in the file name" 2>&1 
    exit 1 
fi 
if [[ -e .offset.$file ]]; then 
    offset=$(<".offset.$file") 
    fi 
if [[ -e $file ]]; then 
    size=$(stat -c "%s" "$file") # this assumes GNU stat, possibly present as gstat. CHECK! 
            # (gstat can also be Ganglias Status tool - careful). 
fi 
if (($size < $offset)); then  # file might have been reduced in size 
    echo "reset offset to zero" 2>&1 
    offset=0 
fi 
echo $size > ".offset.$file" 
if [[ -e $file && $size -gt $offset ]]; then 
    tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" [email protected] 
fi 
+0

В этой части grep на ваш вопрос не было ответа. Оставленный как упражнение. – micans

+0

Нужны полные кавычки вокруг расширений переменных имени файла. Путь к bash неверен для всех систем; возможно, вызывается через 'env'. Вывод 'stat' сильно варьируется между системами и версиями (!). Предполагая, что последний GNU stat, попробуйте -c решить эту проблему и избежать необходимости разбирать. – Sorpigal

+0

Нет необходимости в 'cat':' offset = $ (<. Offset. $ File) '. Вторая часть 'if [[-e $ file && $ size> $ offset]]' является лексическим сравнением, поэтому она не будет делать то, что вы ожидаете, если, например, '$ size' == 10 и' $ offset '== 2. Используйте это вместо:' if [[-e $ file]] && (($ size> $ offset)) '. Вы можете опустить знаки доллара в большинстве случаев внутри '(())' и '$ (())'. –

17

Вы хотите отправить электронное письмо при возникновении ошибок при отправке по электронной почте? Это может произойти сбой;)

Однако вы можете попробовать что-то вроде этого:

tail -f $log | 
grep --line-buffered error | 
while read line 
do 
    echo "$line" | mail -s subject "$email" 
done 

Что для каждой строки в выводе Grep посылает по электронной почте.

Run выше сценарий оболочки с

nohup ./monitor.sh & 

поэтому он будет продолжать работать в фоновом режиме.

+1

вам не нужны обратные косые обратные косые черты - оболочка будет смотреть на следующую строку для трейлинг-канала (а также '&', '&&' и '||') –

+0

Интересно ... одно, что я пропустил. Спасибо @glenn jackman –

+1

Предположим, что я хочу распечатать 10 строк после ошибки (ошибка grep -A 10). В вашем подходе я получаю 10 писем, что мне нужно сделать, чтобы получать только одну почту, включая 10 строк? – markus

 Смежные вопросы

  • Нет связанных вопросов^_^