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
'е, одновременно отправляя изменения, происходящие в реальном времени на отдельный терминал, и сохраняя лог в файл (с перезаписью или дозаписью)Прямая ссылка 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/linu