Я пытаюсь получить размер файла журнала линия пишет с течением времени, в идеале с текущей скоростью и средними значениями за 1, 5 и 15 минут.
Я мог бы сделать что-то вроде этого:
watch wc -l /var/log/<my_file>
.. и, ну, посчитал сам. Я мог бы написать быстрый сценарий. Но в глубине души я верю, что мне не хватает чего-то очевидного ... есть ли уже что-то, что делает это?
FILE=/var/log/syslog
DELAY=10
BEFORE=$(wc -l ${FILE}|cut -f1 -d' ')
sleep ${DELAY}
AFTER=$(wc -l ${FILE}|cut -f1 -d' ')
echo $(($AFTER - $BEFORE))
Дает вам количество строк, добавленных за 10 секунд.
cat / var / log / myfile | while ((((index ++)% 5) == 0)) {sms / chat-session / something}
Обновить: актуальный общий рабочий код:
dmesg | while true; do <br>
if [ $(( $(( index++ )) % 5 )) -eq 0 ]; then
nc -p srcport --send-only hostname port or arduino ...:P
sms/write/chat-session/whatever;
fi
done
При определенных обстоятельствах snmp может быть более полезной идеей.
Logtop может быть вам здесь полезен.
Также телезритель.
Несколько других интересные идеи здесь слишком.
С помощью wc
- хорошее решение для небольших файлов, но оно не работает, когда у вас большие файлы журналов. Чтобы решить эту проблему, мы будем использовать fifo для хранения новых данных в файле и некоторых управляющих данных.
mkfifo /tmp/line_counter
Затем мы отправим в этот FIFO одну строку, содержащую один 0
символ для каждой строки файла журнала (нам не нужна полная строка). Нам нужно использовать sed
здесь без буферизации (-u
) для сохранения вывода в реальном времени. Это задание выполняется в фоновом режиме, чтобы оболочка оставалась доступной, поэтому мы запоминаем ее pid в файле:
tail -f -n 0 your_log_file | sed -u -e 's/.*/0/' >> /tmp/line_counter &
echo $! > /tmp/line_counter_tail_sed_pid
Затем нам понадобится своего рода таймер в FIFO, снова в фоновом режиме:
while true; do echo 1 >> /tmp/line_counter; sleep 1; done &
echo $! > /tmp/line_counter_timer
Затем, самое интересное, давайте прочитаем фифо с awk
:
cat /tmp/line_counter | awk -W interactive '$0 == "0" {line++}
$0 == "1" {count[time % (60*15)]=line; time++; printf "Time %6d: %6d lines read.\n", time, line}
$0 == "1" && time > 60 {printf "%6d lines read in the last minute.\n", count[(time-1) % (60*15)] - count[(time-1-60) % (60*15)]}
$0 == "1" && time > 60*5 {printf "%6d lines read in the last 5 minutes.\n", count[(time-1) % (60*15)] - count[(time-1-60*5) % (60*15)]}
$0 == "1" && time > 60*15 {printf "%6d lines read in the last 15 minutes.\n", count[(time-1) % (60*15)] - count[(time-1-60*15)% (60*15)]}'
В cat
и -W interactive
необходимы для борьбы с буфером.
Когда вы закончите, CTRL-C awk
и:
kill $(cat /tmp/line_counter_timer)
kill $(cat /tmp/line_counter_tail_sed_pid)
rm /tmp/line_counter /tmp/line_counter_timer /tmp/line_counter_tail_sed_pid