Подсказка Bash ниже вывода - хвост фонового журнала

15

Раньше я работал в компании, у которой была настроенная оболочка для управления одним из их продуктов, работавшим в Linux, и я стараюсь воспроизвести ключевую функцию этой оболочки.

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

Журнал будет в фоновом режиме к вашей оболочке, и строка подсказки всегда будет идеально внизу.

Например,

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

Я попытался сделать это с помощью bash, чтобы запустить отдельный хвост в файле .bashrc пользователей, но когда вывод команды отправляется на стандартный вывод - он появляется в приглашении bash, например

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

И пользователю придется нажать клавишу ввода или CtrlCдля получения чистой строки подсказки.

У меня нет идей, как заставить приглашение всегда переходить к нижней части вывода, и я думаю, что использую неправильную терминологию, чтобы найти что-то в Google, потому что мне не повезло - кто-нибудь знает, как это сделать с баш?

iamacarpet
источник
1
Вы хотите, чтобы вывод обновлялся мгновенно или когда вы получаете новое приглашение?
Ахилсенд
Мгновенно, так что это максимально идентично запуску "tail -f", но с подсказкой внизу.
iamacarpet
Что происходит с tail -fвыводом, приглашением и выводом команды, когда вы вводите команду, которая имеет значительный объем вывода, особенно когда ваш фоновый процесс активно отправляет свой вывод?
Приостановлено до дальнейшего уведомления.
В их случае команды, которые выполнялись, вызывали только вывод через фоновый процесс, а не сами по себе, так что это не было проблемой. В этом случае, как только мы получим решение, которое дает желаемый эффект, я думаю, что это будет случай игры и наблюдения за тем, как плохо будет смешиваться вывод на основе реализации к реализации.
iamacarpet
1
Тогда я решительно поддерживаю предложение использовать screen или tmux. Вывод не будет смешиваться или бороться за место на экране, и вы можете изменить размеры окон (переместить разделение) и прокрутить их независимо. Если вы возражаете против того, чтобы заголовки / колонтитулы / строки состояния были «тяжелыми», есть некоторая возможность настроить это. Колеса не изобретены заново.
Приостановлено до дальнейшего уведомления.

Ответы:

1

Следующее делает то, что вам нужно, без использования tmux или screen или других программ. Сохраняет подсказку внизу. Замените "/ 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 Отлично. Рад, что это работает для вас.
Майкл Мартинес
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командой. Однако, если бы у меня был выбор, я бы порекомендовал это решение либо для пользовательской оболочки, либо для других доступных вариантов из-за ее гибкости. Это может быть не так прозрачно для конечного пользователя, но они действительно не будут знать разницу, и опытные пользователи / системные администраторы смогут использовать дополнительную гибкость, предлагаемую 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
Валентин Байрами,