LINUX.ORG.RU

bash скрипт читающий логи, выводящий новые заиси в терминал!!!

 , , ,


0

1

Есть скрипт

#!/bin/bash
mkdir ./scriptlogs
while :
do
ping -c 100 192.168.1.1 | grep % | awk '{print $6 }' > mytest.tmp
i=`cat mytest.tmp | grep % | awk 'BEGIN {FS = "%"} {print $1}'`

if [ $i != 0 ]
then
beep -f 900 -l 1000
script_data=`date +%Y.%m.%d`
script_vremya=`date +%H:%M:%S`
script_procent=`awk '{print $1}' mytest.tmp`
echo "$script_vremya $script_procent 192.168.1.1." >> ./scriptlogs/192.168.1.1pinglog_$script_data.log

fi
rm mytest.tmp
sleep 5
done
всего будет пинговаться 5 ip, нужен скрипт каторый будет периодически читать новые записи из .log файлов и если есть такие, вывадить их в терминал!

tail -f не предлагать?

bl ★★★
()
Ответ на: комментарий от Deleted

Плюсую. Зачем ТС начал писать на баше, когда не умеет писать на инглише? Языки нужно учить по порядку.

CYB3R ★★★★★
()

вывадить их в терминал!

Что делать?

По теме tail -f

andrewzvn
()

Этот скрипт — пример занимательного онанизма. Если нравится занимайтесь, конечно, но если взять check_ping (из пакета nagios-plugins), то вся эта хрень сократится до двух строк.

sdio ★★★★★
()
Ответ на: комментарий от erzent

apt-get install monitoring-plugins-basic — это трудно? алсо чекпинг — это стендалоне бинарник, запускающийся из командной строки.

ymn ★★★★★
()
Ответ на: комментарий от ymn

я сказал нагиос, а не 1-2 плагина, или хочешь сказать, что человек, который его первый раз увидит, не зная английского легко разберёт его синтаксис и что-куда писать?

erzent ☆☆
()
Ответ на: комментарий от erzent

зачем ставить нагиос-то? чекпинг — это просто плагин, для работы которого нагиос не нужен.

ymn ★★★★★
()
Ответ на: комментарий от erzent

С тобой спорить, только время терять. Проходи мимо, этот плагин освоить проще, чем ping,grep,awk

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от sdio

в таком случае проще, я просто сначала подумал, что надо ещё нагиос воткнуть, и настроить его. У меня конфиг нагиоса уже 5 год не меняется, кроме разве что ipшники в нём.

erzent ☆☆
()
Последнее исправление: erzent (всего исправлений: 1)

Давай немного улучшим твой скрипт.

* i можно читать сразу из результатов выполнения пинга, текстовый файл не нужен:

* i можно сравнивать и без удаления символа «%»

* Три переменных для указания даты\времени тебе не нужны, можно использовать подстановки.

* Зачем тебе стопятьсот файлов отчетов по каждому хосту? Ты все равно подставляешь ip в файл, можно все хранить в одном.

* Ты говоришь у тебя 5 ip, так и пробегай их циклом, а то ты сейчас 5 скриптов сделаешь.

С учетом вышесказанного:

#!/bin/bash
mkdir ./scriptlogs
ip="192.168.1.1 192.168.1.2 192.168.1.3"
while :
  do
    for item in $ip
      do
        i=$(ping -c 100 $ip | grep % | awk '{print $6 }')

        if [ "$i" != "0%" ]
          then
            beep -f 900 -l 1000
            echo "$(date +%H:%M:%S) $i ${ip}." >> ./scriptlogs/$(date +%Y.%m.%d).log
        fi
      done
    sleep 5
    done

Теперь про чтение из файла - определись с периодом который тебе нужен, и самый просто вариант будет просто брать какое-то количество последних строк из файла. Это можно сделать при помощи tail -n сколькоСтрокВыбрать имяФайла.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

А, да, ping запускай с ключом -q

И я там ошибся в скрипте, а благодаря лоровским таймаутам поправить не могу. Вот с исправлениями:

#!/bin/bash
mkdir ./scriptlogs
allip="192.168.1.1 192.168.1.2 192.168.1.3"
while :
  do
    for ip in $allip
      do
        i=$(ping -q -c 100 $ip | grep % | awk '{print $6 }')

        if [ "$i" != "0%" ]
          then
            beep -f 900 -l 1000
            echo "$(date +%H:%M:%S) $i ${ip}." >> ./scriptlogs/$(date +%Y.%m.%d).log
        fi
      done
    sleep 5
done
alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 2)

tail -f не предлагать?

По теме tail -f

tail -f ./scriptlogs/*pinglog_*.log

если файл удаляется и создается по новой - то tail -F

anTaRes ★★★★
()

!!!
!

Я б забанил. А если по делу, то tail это умеет. Еще можно, в теории, сделать это на cat, но выводы будут большеваты...

DeadEye ★★★★★
()
Ответ на: комментарий от alozovskoy

Cпасибо. Думаю будет удобнее если статистика по каждому ip будет в отдельном .log Но тогда вывод в терминал выглядит примерно так:

==> ./scriptlogs/pinglog_192.168.1.1.log <== 2014.09.24 18:03:25 4% 192.168.1.1

==> ./scriptlogs/pinglog_192.168.1.2.log <== 2014.09.24 18:03:25 4% 192.168.1.2

==> ./scriptlogs/pinglog_192.168.1.3.log <== 2014.09.24 18:03:25 6% 192.168.1.3

==> ./scriptlogs/pinglog_192.168.1.4.log <== 2014.09.24 18:03:25 6% 192.168.1.4

==> ./scriptlogs/pinglog_192.168.1.5.log <== 2014.09.24 18:03:25 5% 192.168.1.5

хотелось бы избавиться от строки с путем до файла и раскрасить вывод для удобной читаемости, подскажите пожалуйста как это проще сделать?

Ghondik
() автор топика
Ответ на: комментарий от Ghondik

Покажи пример как ты планируешь выводить данные из скриптов в терминал, разберемся. Про цвета - их можно задать при помощи escape-последовательностей.

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

2014.09.24 18:03:25 4% 192.168.1.1

2014.09.24 18:03:25 4% 192.168.1.2

2014.09.24 18:03:25 6% 192.168.1.3

2014.09.24 18:03:25 6% 192.168.1.4

2014.09.24 18:03:25 5% 192.168.1.5

вот так самое оно!!!

Ghondik
() автор топика
Ответ на: комментарий от Ghondik

Не, мне сам скрипт покажи. Если ты по одной строчке из файла хочешь вывести, то можно использовать такой сниппет

for item in filename1 filename2 filename3; do tail -n 1 $item; done

В таком случае tail не будет писать имена файлов.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy
#!/bin/bash
tail -f ./scriptlogs/pinglog_192.168.1.1.log ./scriptlogs/pinglog_192.168.1.2.log ./scriptlogs/pinglog_192.168.1.3.log 
#!/bin/bash
mkdir ./scriptlogs
while :
do
ping -c 100 192.168.1.1 | grep % | awk '{print $6 }' > mytest.tmp
i=`cat mytest.tmp | grep % | awk 'BEGIN {FS = "%"} {print $1}'`

if [ $i != 0 ]
then
beep -f 900 -l 1000
script_data=`date +%Y.%m.%d`
script_vremya=`date +%H:%M:%S`
script_procent=`awk '{print $1}' mytest.tmp`
echo "$script_data $script_vremya $script_procent 192.168.1.1" >> ./scriptlogs/pinglog_192.168.1.1.log

fi
rm mytest.tmp
sleep 5
done
Ghondik
() автор топика
Ответ на: комментарий от Ghondik

подскажите пожалуйста как подсветку сделать? 3десь написано не савсем понятно(((

Ghondik
() автор топика
Ответ на: комментарий от darkenshvein

watch -n5 'dmesg|tail' вроде бы так)

лучше так:

env x='() { :;}; watch -n5 "dmesg|tail"'  bash -c "# logs reader v0.1"

Bash разумеется не обновлять до новых версий.. :-) ну вы понимаете так как новые версии фуууубеспонтовые :-D

user_id_68054 ★★★★★
()
Ответ на: комментарий от user_id_68054

Баш больше никогда не будет прежним.

aplay ★★★★★
()
Ответ на: комментарий от alozovskoy
for item in filename1 filename2 filename3; do tail -f $item; done

этот код выводит инфу ток из первого файла, а не из всех, как поправить чтоб выводил из всех перечисленых?

Ghondik
() автор топика
Ответ на: комментарий от Ghondik

> env x='() { :;}; watch -n5 "dmesg|tail"' bash -c "# logs reader v0.1"

можно бодробнее, непонятно)

ну это такая шутка, связанная с недавней сенсацией о bash — Уязвимость в bash и множественные уязвимости в APT

user_id_68054 ★★★★★
()
Последнее исправление: user_id_68054 (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

простите, я в этом пока еще мало что понимаю) раскрасил так

tail -f filename1 ffilname2 | ccze
помогите с выводом разобраться плиз!!!

Ghondik
() автор топика

Новости не читаешь? Пиши на perl, иначе логи будут выводиться не только в твой терминал.

fero ★★★★
()
Ответ на: комментарий от Ghondik

tail -f будет выполняться пока ты его не остановишь, по-этому он открывает первый файл и может его читать бесконечно. tail -n количествоСтрокДляВывода, указав сколько строк небе нужно считать, или tail -f filename1 filename2 filename3, но тогда будут выводиться имена файлов.

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

спасибо большое alozovskoy, я разобралсо, оказалось утилита `tail' воспринимает опцию`-q' или `-quiet' или `--silent'Не выводит имя файла. Врезультате

tail -f -q filename1 filename2 filename3
то что мне нужно))))))))))

Ghondik
() автор топика

Странно, никто не попенял за

ping -c 100 192.168.1.1 | grep % | awk '{print $6 }' > mytest.tmp
i=`cat mytest.tmp | grep % | awk 'BEGIN {FS = "%"} {print $1}'`
вместо
ping -c 100 192.168.1.1 | awk '/%/ {print $6 }' > mytest.tmp
i=`awk -F "%" '/%/ {print $1}' mytest.tmp`

dexpl ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.