Bash-Eingabeaufforderung unterhalb der Ausgabe - Hintergrundprotokollende

15

Früher habe ich für ein Unternehmen gearbeitet, das eine angepasste Shell für die Verwaltung eines seiner Produkte unter Linux hatte, und ich versuche, eine wichtige Funktion dieser Shell zu replizieren.

Die gesamte Arbeit wurde von einem Hintergrundprozess erledigt, und die Ausgabe aus dem Protokoll wurde allen verbundenen Benutzern angezeigt.

Das Protokoll wird im Hintergrund zu Ihrer Shell angezeigt, und die Eingabeaufforderungszeile bleibt immer ganz unten.

Zum Beispiel

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

Die Art und Weise, wie ich dies mit bash versuchte, bestand darin, einen getrennten Schwanz in der .bashrc-Datei des Benutzers zu starten, aber wenn die Ausgabe des Befehls an stdout gesendet wird, kommt sie unter der Bash-Eingabeaufforderung herein, z

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

Und der Benutzer müsste die Eingabetaste drücken oder CtrlCfür eine saubere Eingabeaufforderung.

Ich habe keine Ahnung, wie ich die Eingabeaufforderung immer ans Ende der Ausgabe bringen kann, und ich glaube, ich verwende die falsche Terminologie, um bei Google etwas zu finden, da ich kein Glück habe - weiß jemand, wie das geht? mit Bash?

Iamacarpet
quelle
1
Sie möchten die Ausgabe sofort aktualisieren oder wenn Sie eine neue Eingabeaufforderung erhalten?
Ahilsend
Sofort, so ist es so identisch wie möglich, nur "tail -f" auszuführen, aber mit der Eingabeaufforderung am unteren Rand.
Iamacarpet
Was passiert mit der tail -fAusgabe und der Eingabeaufforderung sowie der Befehlsausgabe, wenn Sie einen Befehl eingeben, der eine erhebliche Menge an Ausgaben enthält, insbesondere wenn Ihr Hintergrundprozess seine Ausgabe aktiv sendet?
Bis auf weiteres angehalten.
In ihrem Fall verursachten die Befehle, die ausgeführt wurden, nur eine Ausgabe über den Hintergrundprozess und nicht von sich aus, sodass dies kein Problem darstellte. In diesem Fall, wenn wir eine Lösung gefunden haben, die den gewünschten Effekt erzielt, ist es meiner Meinung nach ein Problem zu sehen, wie schlecht die Mischung der Ausgaben von Implementierung zu Implementierung ist.
Iamacarpet
1
Dann unterstütze ich nachdrücklich den Vorschlag, screen oder tmux zu verwenden. Die Ausgabe wird nicht gemischt oder kämpft um Platz auf dem Bildschirm. Sie können die Größe der Fenster ändern (die Teilung verschieben) und unabhängig voneinander scrollen. Wenn Sie dagegen sind, dass die Kopf- / Fuß- / Statuszeilen zu "schwer" sind, können Sie dies konfigurieren. Keine Räder neu erfunden.
Bis auf weiteres angehalten.

Antworten:

1

Das Folgende tut was Sie brauchen, ohne tmux oder screen oder andere Programme zu benutzen. Hält die Eingabeaufforderung unten. Ersetzen Sie "/ var / log / cron" durch die gewünschte Datei:

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

der Schlüssel dazu sind die ANSI-Steuerzeichen für das Terminal. Insbesondere die Anweisung "\ e [x; y", mit der ein neuer scrollbarer Bereich festgelegt wird. Wenn also jede Zeile der Protokolldatei gelesen wird, wird die unterste Zeile des Fensters aus dem bildlauffähigen Bereich ausgeschlossen, die Zeile aus der Protokolldatei wird eingefügt und der untere Teil wird wieder eingefügt.

Michael Martinez
quelle
Danke Michael, das funktioniert wunderbar =] - Ich habe das gelegentliche Problem, dass Sie gerade tippen, während eine Menge Protokollzeilen vorbeirollen. Sie können nicht den gesamten Text in Ihrer Konsolenzeile zurücksetzen (mit dem ich getestet habe) ein beschäftigt Apache-Protokoll), aber für das, wofür ich es verwenden möchte, sollte es kein Problem sein.
Iamacarpet
@iamacarpet Super. Ich bin froh, dass es für dich funktioniert.
Michael Martinez
11

Die Antwort lautet screen oder tmux wurde verwendet

Ich werde erklären, wie Sie dies über den Bildschirm konfigurieren können

1) Installieren Sie den Bildschirm entweder unter Verwendung apt-get install screenvon Ubuntu / Debian- oder yum install screenRedHat-Derivaten.

2) screen -S shell_and_logs

3) Drücken Sie dann Ctrl+ aund anschließend S(Großbuchstabe S).
Ein horizontaler Bildschirm wird angezeigt

4) Drücken Sie Ctrl+ agefolgt von TAB
Dies springt zum zweiten geteilten Fenster.

5) Erstellen Sie hier ein weiteres Fenster, damit Sie die Eingabeaufforderung erhalten, indem Sie die Tasten Ctrl+ aloslassen und dann drückenc

6) Sie können die zweite windo Größe ändern , indem Sie Ctrl+ adann eingeben , :resizenach dem Lines:erscheinen. Geben Sie die Anzahl der Zeilen ein, die Sie anzeigen möchten.

7) Schließlich können Sie mit Ctrl+ und aanschließend zwischen den Fenstern wechseln TAB

Siehe folgendes Beispiel

Valentin Bajrami
quelle
Danke val0x00ff - Ich mag die Idee, es erledigt die Arbeit - aber es sieht nicht so sauber aus wie die Erfahrung, die das fragliche System lieferte. Für einen unerfahrenen Benutzer ist es nicht so transparent - es ist offensichtlich eine andere Shell, anstatt nur das Gefühl zu haben, dass Ihre Haupt-Shell Sie auf dem Laufenden hält.
Iamacarpet
@iamacarpet Dies tail -F /var/log/messages &ist eine andere Möglichkeit, Ihnen Nachrichten anzuzeigen, wenn sich etwas ändert, beispielsweise wenn ein Anmeldefehler festgestellt wird oder wenn bei einem Dienst Probleme auftreten. Dies ist jedoch nicht ideal, da es Ihre interaktive Shell durcheinander bringt.
Valentin Bajrami
Ja, genau das habe ich gefragt - eine Möglichkeit, genau das zu tun, ohne die interaktive Shell durcheinander zu bringen - wie sie es in der Shell des Unternehmens geschafft hatten -, aber es wäre schön, wenn man keine Shell von Grund auf neu schreiben müsste um es zu erreichen.
Iamacarpet
1
@iamacarpet Es gibt eine Reihe von anderen Werkzeugen neben screenund tmuxdas kann dies tun - zum Beispiel einige der BSDs mit einem Schiff windowBefehl. Angesichts der Auswahl würde ich diese Lösung aufgrund ihrer Flexibilität entweder einer benutzerdefinierten Shell oder den anderen verfügbaren Optionen vorziehen. Es mag für den Endbenutzer nicht so transparent sein, aber er wird den Unterschied nicht wirklich kennen, und Hauptbenutzer / Systemadministratoren können die zusätzliche Flexibilität von nutzen screen.
Voretaq7
@iamacarpet Schreiben t=$(mktemp); printf '%s\n' 'screen tail -F /var/log/messages' split focus screen > "$t"; screen -S screenname -c "$t"Sie es in ein Skript und führen Sie es jedes Mal aus, wenn Sie möchten. Vielen Dank an geirha für diesen Eintrag bei #bash @ irc.freenode.org
Valentin Bajrami