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?


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.