Толик Панков
hex_laden
............ .................. ................
December 2025
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

Толик Панков [userpic]
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=0 - 0 - по завершению скрипта лог не удаляется, 1 - удаляется.
LOG_APPEND=1 - 0 - при каждом запуске создается новый файл. 1 - добавление данных в лог, если он существует.

Скрипты на GitHub

Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2020/10/25/linux-dialog-tailbox/

Tags: , ,