Linux dialog —tailbox

tailbox — интересный виджет программы dialog, позволяющий видеть дополнения в текстовом файле в реальном времени, что делает его удобным для отображения логов


Прямая ссылка: https://youtu.be/kdOjJFtbuI4

Если переданный программе лог не дополняется, то tailbox просто отображает последние строки из файла (насколько хватает заданных размеров виджета)

Вызов виджета:

dialog --title "заголовок_окна"  \
	  --exit-label "Надпись_на_кнопке_выхода" \
       --tailbox "текстовый_файл" высота ширина

Например:

dialog --title "LOG"  \
	  --exit-label "Close log window" \
       --tailbox "/tmp/mylog.log" 24 70

Для демонстрации написал простой log viewer.
Использование:

logview путь_к_файлу


#!/bin/bash

DIALOG="dialog"

#check dialog utility
$DIALOG >/dev/null 2>/dev/null
RETVAL=$?
if [ "$RETVAL" -eq 126 ]; then
    echo "$DIALOG access denied or not execute file!"
    exit 1
fi
if [ "$RETVAL" -eq 127 ]; then
    echo "$DIALOG not found!"
    exit 1
fi

#check parameters and print help
if [ -z "$1" ]; then
    echo "Use " `basename $0` "<log_file>"
    exit 1
fi
if [[ "$1" == "-h" ]]; then
    echo "Use " `basename $0` "<log_file>"
    exit 1
fi
if [[ "$1" == "--help" ]]; then
    echo "Use " `basename $0` "<log_file>"
    exit 1
fi

#check file
if [ ! -f "$1" ];then
    $DIALOG --title "Error" --msgbox "$1 not found or not a file!" 10 41
    exit 1
fi

$DIALOG --title "LOG"  \
	--exit-label "Close log window" \
     --tailbox "$1" 24 70

Скрипт на GitHub

Отправка лога одновременно на дополнительный терминал, в файл и отображение в tailbox’е

Вроде бы виджет простой, но при некоторой смекалке можно делать интересные вещи, например, вести лог сразу в трех местах — отображая его в --tailbox‘е, одновременно отправляя изменения, происходящие в реальном времени на отдельный терминал, и сохраняя лог в файл (с перезаписью или дозаписью)

Прямая ссылка https://youtu.be/AARNx4SbYJg

Добиться этого можно, совместив dialog tailbox с командой tee (копия).

Написал демонстрационный скрипт:

#!/bin/bash

DIALOG="dialog"

LOG_FILE="./test.log"
LOG_TTY="/dev/tty4"
RMLOG=0
LOG_APPEND=1

if [ -z "$LOG_FILE" ]; then
    LOG_FILE="./log.tmp"
    RMLOG=1
    LOG_APPEND=0
fi

if [ -z "$LOG_TTY" ];then #no TTY, only log
    if [ "$LOG_APPEND" -eq 1 ];then #append log
	./tscript >>"$LOG_FILE" &
    else #new log
	./tscript >"$LOG_FILE" &
    fi
else #log and tty
    if [ "$LOG_APPEND" -eq 1 ];then #append log
	./tscript |tee -a "$LOG_FILE" >"$LOG_TTY" &
    else #new log
	./tscript |tee "$LOG_FILE" >"$LOG_TTY" &
    fi
fi

$DIALOG --title "LOG"  \
	--exit-label "Close log window" \
        --tailbox "$LOG_FILE" 24 70

if [ "$RMLOG" -eq 1 ]; then
    rm "$LOG_FILE"
fi

В качестве источника логов, демо-скрипт вызывает в фоновом режиме другой скрипт tscript, который выводит 10 случайных чисел на консоль и завершает работу:

#!/bin/bash

SEC=1
CTR=10

echo "Test script, write to STDOUT random number after $SEC sec."

while [ "$CTR" -ne 0 ];do
    let "CTR=CTR-1"
    printf '%x Number: %x\n' $CTR $RANDOM
    sleep $SEC
done

echo "Complete!"

Настройки скрипта для поиграться можно провести через внутренние переменные:

LOG_FILE="./test.log" — если значение не задано, создается временный файл, который по завершению скрипта удаляется.
LOG_TTY="/dev/tty4" — если значение не задано, лог в реалтайме не отправляется на дополнительный терминал
RMLOG=00 — по завершению скрипта лог не удаляется, 1 — удаляется.
LOG_APPEND=10 — при каждом запуске создается новый файл. 1 — добавление данных в лог, если он существует.

Скрипты на GitHub

2 Responses to Linux dialog —tailbox

  1. I want to pipe its output to to dialog. —tailbox and —progressbox handle this well, except that if the output becomes too much, you can only see as much as the screen fits.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *