desincarnated (desincarnated) wrote,
desincarnated
desincarnated

скрипт с tail -f как сервис.

иногда возникает нужда отслеживать какое-то отдельное событие по общему логу большого сервиса. в этом случае вполне выручает скрипт с формулой
tail -f /var/log/servlog | grep 'PATTERN'

однако, при запуске такого cкрипта в фоне выплывает одно затруднение - мы получаем 2 процесса с скриптом, еще один с тейлом с грепом. и при завершении того процесса, pid которого мы получили после &, tail и второй остануться работать. Что и так не здорово, а при запуске скрипта в виде сервиса и вовсе нежелательно. вот как это можно решить:

#!/bin/bash
tail --pid=$$ -f /var/log/servlog | grep --line-buffered -E 'PATTERN' |
while read line
do
        echo "$line" >> /var/log/test/cevent.log
done


в этом случае tail и вся остальная активность порожденная запуском скрипта завершится, при закрытии процесса, pid которого мы уже знаем. Чтобы запустить скрипт как полноценный сервис который будет запускаться _и управлятся_ нужно прописать в init.d управляющйи скрипт. для систем с sysvinit:
[cut]
start() {
        echo "start: `date`" >> /var/log/test/conlog.log
        /opt/test/conwatch.sh &
        echo $!>/var/run/conlog.pid
        return
}

stop() {
        echo "stop: `date`" >> /var/log//test/conlog.log
        kill $(cat /var/run/conlog.pid)
        rm /var/run/conlog.pid
        return
}

status() {
        if [ -e /var/run/conlog.pid ]; then
        echo conlog  is running, pid=$(cat /var/run/conlog.pid)
        else
        echo conlog is NOT running
        exit 1
        fi
        return
}

case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;
 restart)
        stop
        start
        ;;
 status)
        status
        ;;
 *)
        echo "Usage: $0 {start|stop|restart|status}"
esac
exit 0

что писать в шапке скрипта - смотрите в вашей системе. и вообще поищите skeleton

строка с вайлдчарами в grep.

если awk sed и grep не явлюятся вашими разговорными инструментами ;) можно встретить затруднения при попытке найти грепом что-то по паттерну с вайлдчарами. Вообще конечно полезно почитать про синтаксис регекспов в грепе, но вот необходимый минимум:

наиболее общим вариантом подачи паттерна с регекспом является -E 'PATTERN'

чары совпадающие со специальными символами, независимо от -E, надо эскейпить '\'

специальные символы:

. - любой ОДИН чар.

* - любое количество чара (в том числе 0) ПЕРЕД звездочкой.

тоесть, чтобы найти строку в которой есть 2 ключевых слова, разделенные любым количеством символов, надо писать так:
word1.*word2

^ - начало строки
$ - конец строки

кстати, чтобы найти ip адрес надо писать grep '192\.168\.1'
Tags: kb, tech
Subscribe

  • трудовыебудни

    темной темной ночью, очнувшись от зыбкого сна умбра уполз на кухню, и с раскалывающейся от недосыпа головой раскрутил свой верный x230 чтобы вставить…

  • постковидный эффект

    Я тут сейчас напишу крамольного, но больше некуда. Сдается мне, есть еще один постковидный эффект. Итак. У меня есть сильное ощущение, что за…

  • железки

    стряхнул пыль (буквально) с давно непопадавшего в зону поражения руками китайского роутера mi router 3G. (в связи с тем, что решил обновить берлогу…

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments