Wie kann ich aufhören, der Ausgabe in weniger zu folgen, ohne den Befehl zu beeinflussen, der die Ausgabe generiert?

11

Ich verwende einen Server und das Protokoll dieses Servers wird im Terminal angemeldet, nicht in einer Datei. Ich möchte weniger verwenden, um dieses Protokoll anzuzeigen.

node server.js | less

Wenn ich nur das Protokoll sehen möchte, drücke ich Shift+, Fum zum Dateiende zu gelangen und die Protokolle weiter zu beobachten. Wenn ich es stoppen möchte, benutze ich CTRL+ C.

Leider stoppt dies auch den Server. Ich möchte nur aufhören, das Ende des Protokolls zu beobachten, ohne den Server anzuhalten.

Wie macht man das?

Ajay Kumar
quelle
1
Möchten Sie beenden lessund zu Ihrer Shell-Eingabeaufforderung zurückkehren, während der nodeServer im Hintergrund ausgeführt wird, oder möchten Sie einfach lessin den normalen Nicht-Folgemodus zurückkehren, in dem Sie durch das Protokoll scrollen können, anstatt die neuesten Zeilen zu sehen?
Byte Commander
@ByteCommander, wenn ich STRG + C drücke. Ich möchte, dass mein Server weiter läuft und ich möchte in den weniger normalen Nicht-Folgemodus zurückkehren, in dem ich scrollen kann.
Ajay Kumar

Antworten:

16

Ich kann den FModus nicht verlassen less, daher müssen Sie eine Problemumgehung verwenden. Speichern Sie beispielsweise die Ausgabe in einer tmp-Datei und beobachten Sie stattdessen diese tmpfile:

node server.js > tmpfile & less tmpfile

Das &macht den node.jsBefehl im Hintergrund ausgeführt werden . Dies bedeutet, dass dies less tmpfilesofort startet und die tmpfile verfolgt.

Einmal in less, können Sie drücken, Fum in den Verfolgungsmodus zu wechseln, aber jetzt Ctrl+ Cwird der Server nicht beendet, sondern nur die Verfolgung gestoppt. Sie können jetzt nach Belieben scrollen und auf klicken F, um die folgenden Schritte fortzusetzen.

Terdon
quelle
13

Es scheint, dass Sie normalerweise man lessden Modus "Für immer weiterleiten" nicht verlassen sollten. So benennt das Handbuch den Modus, den Sie beim Drücken von Shift+ aufrufen F.

Ich habe jedoch einen kleinen schmutzigen Trick gefunden, wie man sowieso wieder normal werden kann. Der Befehl wird jedoch kurz eingefroren, sodass ich nicht sicher bin, ob er für Ihren Server geeignet ist, der wahrscheinlich ohne Unterbrechung ausgeführt werden sollte.


Wie auch immer, hier ist der Trick:

Ich node server.js | lessgehe davon aus, dass Sie bereits gestartet und Shift+ gedrückt haben, Fum in den Modus "Für immer weiterleiten " zu wechseln. lessReagiert jetzt nicht mehr auf Tastendrücke.

In diesem Zustand können Sie Ctrl+ drücken C, um den Serverprozess zu beenden, und lessanschließend durch Drücken von beenden Q(was den Befehl jedoch aus irgendeinem Grund als gestoppten Prozess in Ihrer Jobliste belässt - Sie müssen ihn ausführen fg, um ihn fortzusetzen und vollständig zuzulassen danach beenden), aber das ist nicht was wir wollen.

Stattdessen können Sie auch Ctrl+ drücken Z, um den Befehl zu stoppen ("einzufrieren") und zu Ihrer Shell-Eingabeaufforderung zurückzukehren. Geben Sie nun schnell den Shell-Befehl fg(" f ore g round") ein, damit der Befehl weiterhin im Vordergrund ausgeführt wird. Beachten Sie, dass Ihr nodeServerprozess auch während dieser kurzen Zeit angehalten wird. Sie müssen überlegen, ob dies akzeptabel ist oder nicht.

Läuft jetzt lessalso wieder wie zuvor im Vordergrund, oder? Ja, aber magischerweise befindet es sich nicht mehr im Modus "Für immer weiterleiten". Sie können zB die Pfeiltasten erneut verwenden, um nach oben und unten zu scrollen.

Leider lessscheint die Aktualisierung des Puffers vollständig gestoppt zu sein. Sie können nur bis zu der Zeile scrollen, in der Sie den Befehl zuvor eingefroren haben, nicht weiter. Der nodeServer läuft noch und produziert Ausgabe, wir müssen nur noch lesseinmal aktualisieren.

Der einfachste Weg, dies zu tun, besteht darin, den Hilfebildschirm einfach zu öffnen lessund wieder zu schließen, indem ich die Tasten Hund Qnacheinander drücke. Jetzt scheint alles wieder gut zu funktionieren.


Die sauberste Lösung besteht jedoch wahrscheinlich darin, der Antwort von terdon zu folgen und die Ausgabe in eine temporäre Datei umzuleiten less, um die Datei zu überwachen.

Byte Commander
quelle
Ein ziemlich brillanter Dirty Hack.
TRiG
Ich glaube, ich ziehe diese Antwort der akzeptierten vor. Beachten Sie, dass Sie ausführen können , %statt fg; Ich finde es einfacher / schneller zu tippen. Es scheint auch, dass F(Shift-F) auch ohne hqTrick funktioniert . Nett! Wenn ich jetzt Protokollen folge, kann ctrl-z % Enterich weniger tun und dann durch Schlagen wieder folgen F!
JoL
Übrigens sollten Sie es nicht schmutzig nennen. Persönlich scheint dies sauberer als die anderen Lösungen wie hier, Sie haben nicht zu Wurf Ihr Dateisystem mit temporären Dateien (für die Sie einen Namen denken und dann entfernen), insbesondere wenn Sie verwenden möchten , könnten less‚s folgen Funktion in mehreren Terminals gleichzeitig.
JoL
2
Ich habe nicht in der Quelle gesucht, aber dies funktioniert wahrscheinlich, weil das TSTPSignal den Aufruf des Lesesystems unterbricht, der auf das Eintreffen neuer Daten wartete. lessempfängt 0 Bytes und kommt zu dem Schluss, dass die Ausgabe beendet wurde. Öffnen Sie ein neues Terminalfenster, um eine Unterbrechung des Servers zu vermeiden. Ausführen psund Identifizieren der Prozess-ID des lessProzesses; Geben Sie dann ein kill -TSTP <PID>; kill -CONT <PID>. Auf diese Weise sollten die Signale während der Eingabe ohne Verzögerung hintereinander übertragen werden.
Alexis
@alexis Wenn Sie verwenden möchten kill, können Sie stattdessen einfach SIGINT senden. Dann müssen Sie nicht senden CONTund lesswarten nur auf Sie.
Muru
3

Wie Ihre Frage sagt:

Dieser Server wird im Terminal angemeldet, nicht in einer Datei.

Ich gehe davon aus, dass Sie keine (temporäre) Protokolldatei verwenden möchten, vielleicht ist Ihr Protokoll riesig oder aus welchem ​​Grund auch immer.


Named Pipe, fifoDatei.

Was ich mir ausgedacht habe, ist die Verwendung einer named pipe fileauch als fifoDatei bezeichneten Datei. Diese Datei wird nur verwendet, um Ihre Protokolle auf weniger zu leiten, und es wird nichts darauf gespeichert.

Erstellen Sie zuerst ein fifo file:

mkfifo mylog

Führen Sie Ihren Server aus und leiten Sie die Protokolle in diese Datei um:

node server.js > mylog &

Verwenden Sie weniger zum Lesen Ihrer Protokolle (-f erzwingt weniger zum Lesen dieser speziellen Datei):

less -f mylog

Jetzt können Sie shift+ verwenden F, um zu folgen, und CTRL+ C, um das Folgen zu stoppen, aber der Server läuft noch. Sie können die Ausgabe erneut mit shift+ verfolgen F.


Sicherungsplan : Wenn Ihr Server gestoppt wurde, fügen Sie einfach Ihren Befehl ( node server.js > mylog &) in eine Datei ein, z. B.: server.sh, Anstatt node server.js > mylog &run: auszuführen, bash server.sh > mylog &und führen Sie dann den aus less -f mylog.

Ravexina
quelle
Was bringt es, hier ein FIFO anstelle einer regulären Datei zu verwenden? Der einzige Vorteil, den ich sehen kann, ist die Einsparung von Speicherplatz, aber ich bezweifle, dass dies für so etwas relevant sein wird. Nachdem Sie fertig sind, haben Sie dort noch eine Datei, die Sie manuell löschen müssen.
Terdon
2
Ich empfehle hier gegen ein FIFO, da der Serverprozess möglicherweise zum Stillstand kommt, wenn der FIFO-Puffer voll ist, wenn niemand (mehr) Protokolldaten anfordert. Wenn die Größe der Protokolldatei zu einem Problem wird, sollte wirklich eine geeignete Protokolldatei plus verwendet werden logrotate.
David Foerster
@terdon Wie Sie sagten, ist der einzige Punkt das Speichern der Festplatte. Ich dachte, das OP möchte nicht, dass seine Protokolle auf der Festplatte gespeichert werden.
Ravexina
@ DavidFoerster +1 guter Punkt;)
Ravexina