Підказка Bash під виходом - хвостовий фон журналу


15

Раніше я працював у компанії, яка мала індивідуальну оболонку для управління одним із своїх продуктів, що працює на Linux, і я прагну повторити ключову особливість цієї оболонки.

Всі роботи виконувались фоновим процесом, а вихід із журналу відображався всім підключеним користувачам.

Колода буде хвостиком на задньому плані до вашої оболонки, а підказлива лінія завжди буде ідеально триматися внизу.

Наприклад, наприклад

Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #

Я намагався зробити це з bash - запустити відірваний хвіст у файлі .bashrc користувача, але коли вихід з команди надсилається до stdout - він надходить під запит bash, наприклад

![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3

І користувачеві доведеться натиснути клавішу enter або CtrlCдля отримання чистого рядка рядка.

Мені не до думок, як зробити так, щоб підказки завжди переходили до нижньої частини результату, і я думаю, що я використовую неправильну термінологію, щоб знайти що-небудь у Google, оскільки мені не пощастило - хтось знає, як це зробити з баш?


1
Ви хочете миттєво оновити вихід або коли з’явиться новий запит?
ахільсенд

Миттєво, так що це максимально ідентично просто запущеному "хвіст -f", але з підказкою внизу.
iamacarpet

Що відбувається з tail -fвисновком та підказом та виведенням команди, коли ви вводите команду, яка має значну кількість виводу, особливо коли ваш фоновий процес активно надсилає свій вихід?
Призупинено до подальшого повідомлення.

У їхньому випадку команди, які виконувались, викликали лише вихід у фоновому процесі, а не самостійно, тому це не було проблемою. У цьому випадку, як тільки ми отримаємо рішення, яке дає бажаний ефект, я думаю, що це було б справою і бачимо, як погано буде змішуватися результат на основі впровадження.
iamacarpet

1
Тоді я наполегливо підтримую пропозицію використовувати екран або tmux. Вихідні дані не змішаться і не будуть боротися за екранний простір, і ви можете змінити розмір вікон (перемістити спліт) і прокрутити їх самостійно. Якщо ваше заперечення стосується того, що рядки колонтитула / колонтитула / статусу є "важкими", є можливість налаштувати це. Жодні колеса не винаходилися.
Призупинено до подальшого повідомлення.

Відповіді:


1

Далі робиться те, що потрібно, не використовуючи tmux, екран або інші програми. Зберігає підказку внизу. Замініть "/ var / log / cron" будь-яким файлом, який вам потрібен:

#!/bin/bash 
L=$(tput lines)
L1=${L}
(( L1-- ))
C=$(tput cols)
tput cup ${L} 0
tail -f /var/log/cron | while read line; do 
  tput sc
  printf "\e[1;${L1}r\e[${L1};${C}f" 
  echo; echo ${line}
  printf "\e[1;${L}r" && tput rc
done

ключ до цього - символи управління ANSI для терміналу. Особливо твердження "\ e [x; y", яке встановлює нову область, що прокручується. Отже, коли читається кожен рядок файлу журналу, нижній рядок у вікні виключається із області прокрутки, рядок із файлу журналу вставляється, а потім додається нижня частина.


Дякую Майклу, це прекрасно працює =] - У мене виникають випадкові проблеми, коли ви набираєте текст, поки прокручується багато рядків журналу, ви не можете повернути весь текст у рядку консолі (я тестував журнал apache зайнятий), але для того, для чого я хочу його використовувати, це не повинно бути проблемою.
iamacarpet

@iamacarpet Awesome. Радий, що працює на вас.
Майкл Мартінес

11

Відповідь - екран або використовується tmux

Я поясню, як ви могли налаштувати такі за допомогою екрана

1) Встановіть екран за допомогою похідних apt-get install screenUbuntu / Debian або yum install screenRedHat.

2) screen -S shell_and_logs

3) Потім натисніть Ctrl+ a, а потім S(велика літера S).
З'явиться горизонтальний екран

4) Натисніть Ctrl+, aа потім TAB
Це перейде до другого вікна розділення.

5) Створіть тут ще одне вікно, щоб ви отримали командний рядок, натиснувши Ctrl+ aвідпустіть клавіші, а потім натиснітьc

6) Ви можете змінити розмір другого віндо, натискаючи Ctrl+, aа потім ввівши, :resizeпісля чого Lines:з'явиться. Введіть кількість рядків, які ви хочете показати.

7) Нарешті, ви можете перемикатися між вікнами на Ctrl+, aа потім наTAB

Дивіться приклад нижче


Дякую val0x00ff - мені подобається ідея, вона виконує роботу - але вона виглядає не так чисто, як досвід роботи системи, про яку йдеться. Для недосвідченого користувача це не так прозоро - це, очевидно, інша оболонка, а не просто відчуття, ніби ваша основна оболонка постійно оновлює вас.
iamacarpet

@iamacarpet tail -F /var/log/messages &Інший спосіб показувати вам повідомлення, коли щось змінюється, наприклад, коли виявлено помилку входу або коли в деяких служб є проблеми. Однак це не ідеально, оскільки це зіпсує вашу інтерактивну оболонку.
Валентин Байрамі

Так, саме про це я просив - спосіб зробити просто це, не псуючи інтерактивну оболонку - як це їм вдалося зробити в оболонці компаній - але було б непогано не писати оболонку з нуля здійснити це.
iamacarpet

1
@iamacarpet Є купа інших інструментів , крім того , screenі tmuxщо можна зробити - наприклад , деякі з BSDs корабля з windowкомандою. Зважаючи на вибір, я б рекомендував це рішення або через користувацьку оболонку, або за іншими доступними параметрами через свою гнучкість. Це може бути не настільки прозорим для кінцевого користувача, але вони дійсно не знають різниці, і енергетичні користувачі / sysadmins зможуть використовувати додаткову гнучкість, яку пропонує screen.
voretaq7

@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Помістіть його в сценарій і запустіть його щоразу, коли захочете. Завдяки гейрі за це на #bash @ irc.freenode.org
Валентин Байрамі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.