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
Вроде бы виджет простой, но при некоторой смекалке можно делать интересные вещи, например, вести лог сразу в трех местах — отображая его в --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
— добавление данных в лог, если он существует.
2 Responses to Linux dialog —tailbox