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

May 14, 2020 10:35

иногда возникает нужда отслеживать какое-то отдельное событие по общему логу большого сервиса. в этом случае вполне выручает скрипт с формулой

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'

tech, kb

Previous post Next post
Up