Podpowiedź Bash poniżej wyniku - ogon dziennika tła

15

Pracowałem kiedyś dla firmy, która miała dostosowaną powłokę do zarządzania jednym z ich produktów, która działała w systemie Linux, i chcę replikować kluczową funkcję tej powłoki.

Całą pracę wykonano w tle, a dane wyjściowe z dziennika są wyświetlane wszystkim podłączonym użytkownikom.

Dziennik ogoniłby cię w tle do twojej skorupy, a wiersz zachęty zawsze pozostawałby idealnie na dole.

Na przykład

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

Próbowałem to zrobić za pomocą basha, aby uruchomić odłączony ogon w pliku .bashrc użytkownika, ale kiedy dane wyjściowe polecenia są wysyłane do standardowego wejścia - pojawia się ono pod pytaniem bash, np.

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

A użytkownik musiałby nacisnąć Enter lub CtrlCuzyskać czysty wiersz zachęty.

Nie mam pomysłów, jak sprawić, by monit zawsze przeskakiwał na dół wyników i myślę, że używam złej terminologii, aby znaleźć coś w Google, ponieważ nie mam szczęścia - czy ktoś wie, jak to zrobić z uderzeniem?

iamacarpet
źródło
1
Chcesz natychmiastową aktualizację wyników lub gdy pojawi się nowy monit?
ahilsend
Natychmiast, więc jest tak identyczne jak to tylko możliwe, uruchamiając „tail -f”, ale z pytaniem u dołu.
iamacarpet,
Co dzieje się z danymi tail -fwyjściowymi i monitem oraz danymi wyjściowymi polecenia po wprowadzeniu polecenia, które ma znaczną ilość danych wyjściowych, szczególnie gdy proces w tle aktywnie wysyła dane wyjściowe?
Wstrzymano do odwołania.
W ich przypadku polecenia, które byłyby uruchamiane, powodowały wyjście tylko w tle, a nie same, więc nie było problemu. W tym przypadku, gdy otrzymamy rozwiązanie, które daje pożądany efekt, myślę, że byłoby to zagranie i zobaczenie, jak źle zmieszane byłyby wyniki w zależności od wdrożenia.
iamacarpet
1
Następnie zdecydowanie popieram sugestię używania screena lub tmuxa. Wyjście nie będzie mieszane ani nie będzie walczyć o miejsce na ekranie. Możesz zmienić rozmiar okien (przesunąć podział) i przewijać je niezależnie. Jeśli sprzeciwisz się temu, aby linie nagłówka / stopki / statusu były „ciężkie”, istnieje możliwość skonfigurowania tego. Nie wymyślono ponownie kół.
Wstrzymano do odwołania.

Odpowiedzi:

1

Następujące czynności wykonuje to, czego potrzebujesz, bez korzystania z Tmux, ekranu lub innych programów. Utrzymuje monit na dole. Zamień „/ var / log / cron” na dowolny potrzebny plik:

#!/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

kluczem do tego są znaki kontrolne ANSI dla terminala. W szczególności instrukcja „\ e [x; y”, która ustanawia nowy obszar przewijalny. Tak więc, gdy każdy wiersz pliku dziennika jest odczytywany, dolna linia w oknie jest wykluczana z przewijalnego obszaru, linia z pliku dziennika jest wstawiana, a następnie dolna część jest ponownie dodawana.

Michael Martinez
źródło
Dzięki Michael, to działa pięknie =] - Od czasu do czasu mam problem z tym, że piszesz, podczas gdy przewija się dużo linii dziennika, nie możesz cofnąć całego tekstu na linii konsoli (testowałem z zajęty dziennik apache), ale do tego, do czego chcę go używać, nie powinno to stanowić problemu.
iamacarpet
@iamacarpet Awesome. Cieszę się, że to działa dla ciebie.
Michael Martinez,
11

Odpowiedź brzmi screen lub tmux został użyty

Wyjaśnię, jak możesz skonfigurować takie za pomocą screena

1) Zainstaluj ekran przy użyciu programów pochodnych apt-get install screenUbuntu / Debian lub yum install screenRedHat.

2) screen -S shell_and_logs

3) Następnie naciśnij Ctrl+ a, a następnie S(wielkie S).
Pojawi się poziomy ekran

4) Naciśnij Ctrl+, aa następnie TAB
To spowoduje przejście do drugiego okna podziału.

5) Utwórz tutaj kolejne okno, aby uzyskać wiersz polecenia, naciskając Ctrl+ azwolnij klawisze, a następnie naciśnijc

6) Możesz zmienić rozmiar drugiego windo, naciskając Ctrl+, aa następnie wpisując, :resizepo czym Lines:pojawi się. Wprowadź liczbę linii, które chcesz wyświetlić.

7) Wreszcie możesz przełączać się między oknami za pomocą Ctrl+, aa następnieTAB

Zobacz przykład poniżej

Valentin Bajrami
źródło
Dzięki val0x00ff - podoba mi się pomysł, wykonuje pracę - ale nie wygląda tak czysto, jak wrażenia z systemu, o którym mowa. Niedoświadczonemu użytkownikowi nie jest tak przejrzysty - to oczywiście kolejna powłoka, a nie tylko poczucie, że twoja główna powłoka informuje Cię na bieżąco.
iamacarpet,
@iamacarpet Jest tail -F /var/log/messages &to inny sposób pokazywania wiadomości, gdy coś się zmienia, na przykład w przypadku wykrycia błędu logowania lub problemów z pewną usługą. Nie jest to jednak idealne, ponieważ zepsuje interaktywną powłokę.
Valentin Bajrami
Tak, dokładnie o to prosiłem - sposób na zrobienie tego bez zepsucia interaktywnej powłoki - ponieważ tak właśnie zrobili w powłoce firmowej - ale fajnie byłoby nie pisać od nowa powłoki aby to osiągnąć.
iamacarpet,
1
@iamacarpet Istnieje kilka innych narzędzi poza screeni tmuxże może to zrobić - na przykład niektóre z BSD dostarczany z windowpoleceniem. Biorąc pod uwagę wybór, poleciłbym to rozwiązanie w stosunku do niestandardowej powłoki lub innych dostępnych opcji ze względu na jej elastyczność. Może nie być tak przejrzysty dla użytkownika końcowego, ale tak naprawdę nie znają różnicy, a zaawansowani użytkownicy / sysadmini będą mogli skorzystać z dodatkowej elastyczności oferowanej przez screen.
voretaq7
@iamacarpet t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Umieść go w skrypcie i uruchom go za każdym razem, gdy chcesz. Dzięki geirha za to na #bash @ irc.freenode.org
Valentin Bajrami