Weniger störend in weniger

2400
Ed McMan

Ich pfeife oft die Programmausgabe auf weniger, z

produce_output | less 

Dies funktioniert gut, bis produce_outputgroße Mengen produziert werden. Wenn ich nach Text suche, der sich tief in der Datei befindet, werden weniger Berichte angezeigt

Calculating line numbers... (interrupt to abort) 

Wenn ich mit Control + C unterbreche, tötet es auch produce_output, was die Produktion weiterer Ausgaben verhindert. Gibt es eine Möglichkeit, den Interrupt an weniger zu senden, damit er weiter produce_outputläuft?

Ich weiß, dass ich verwenden könnte kill -INT less_process, aber ich denke, dass es eine bessere Lösung geben muss.

11

4 Antworten auf die Frage

13
grawity

Normally all processes in a pipeline run in the same process group, causing all of them to receive the signal. You can use setsid foo | less to run foo in a different pgrp.

Angesichts des von OP aufgeworfenen Problems scheint die Entscheidung, STRG + C zu verwenden, um weniger zu unterbrechen, sehr ungünstig. Wissen Sie, warum dieses spezielle Signal gewählt wurde? Wäre ein anderes Signal weniger problematisch? Piotr Dobrogost vor 9 Jahren 0
@PiotrDobrogost: Welches andere Signal würden Sie vorschlagen? Es gibt nicht viele, die dedizierte Tastenkombinationen haben, nur SIGINT (Ctrl-C) und SIGQUIT (Ctrl - \\). Letzteres soll das Programm sofort beenden, nicht nur unterbrechen. Der Rest ist nur über "Kill" verfügbar. grawity vor 9 Jahren 0
Es scheint, dass das Problem dadurch verursacht wird, dass das Signal verwendet wird, um weniger zu unterbrechen. Wenn es sich um eine * normale * Taste / Abkürzung handelt, hätten wir das Problem nicht an erster Stelle. Ich denke jedoch, dass ein Signal benötigt wird, weil der Prozess nicht `select 'verwenden kann, um gleichzeitig auf die Eingabe von Datei / Pipe und Terminal zu warten. Piotr Dobrogost vor 9 Jahren 0
@PiotrDobrogost: Das kann, so funktioniert der `F` (Follow) -Modus. Pipes und ttys sind auf dieselbe Weise abrufbar. grawity vor 9 Jahren 0
Warum, glaubst du, funktioniert der Follow-Modus? Ich denke, der Fluss der Ereignisse ist, dass die Shell STRG + C erhält und das SIGINT-Signal an less sendet, was dieses Signal asynchron erhält, ohne * auf Tastatur / Terminal zu hören. Piotr Dobrogost vor 9 Jahren 0
9
Matteo

Mit können Sie die Zeilennummern deaktivieren

 -n or --line-numbers 

Möglichkeit.

produce_output | less -n 
-1: kann das Problem lösen, löst jedoch die eigentliche Frage von OP aus (dh Unterbrechung eines Prozesses). goldPseudo vor 12 Jahren 0
Tut mir leid, aber weniger mit einer Funktion zu beginnen, die nicht erwünscht ist, und dann versuchen, ein Signal zu senden, um eine Funktion zu deaktivieren, die Sie mit einem Switch deaktivieren können, ist eine Problemumgehung und keine Lösung. Natürlich ist die @grawity-Lösung nett (und ich habe sie gewählt), aber komm schon: Der erste Prozess in einer anderen Gruppe zu starten, um ein Signal senden zu können, das eine nicht benötigte Task (Zeilenzählung) unterbricht, ist nicht wirklich ein bisschen viel Arbeit. Matteo vor 12 Jahren 2
Dies ist eine faire Lösung für das Problem, das ich in meiner Frage gestellt habe. Interrupts stoppen jedoch mehr als nur das Zählen in weniger - zum Beispiel unterbrechen sie auch eine lange Suche. Daher ist die Lösung von @ grawity bevorzugt, da sie die Verwendung von Interrupts in geringerem Umfang abdecken würde. Mein schlechtes, dass ich das in der Frage nicht klarer angesprochen habe! Ed McMan vor 12 Jahren 1
@EdMcMan Natürlich habe ich auch die Lösung von gravity gewählt und ich freue mich, etwas Neues zu lernen, das immer nützlich sein kann. Matteo vor 12 Jahren 0
0
jrennie

Bei der Arbeit mit großen Ausgaben habe ich es sehr hilfreich gefunden, die Ausgabe in eine Datei zu senden und zu verwenden tail -foder less +Fzu beobachten, zB:

produce_output > out 2>&1 & less +F out 

Die 2>&1Syntax stellt sicher, dass sowohl stdout als auch stderr zu out--- gehen, entfernen Sie diese Option, wenn Sie nur stdout zur Datei möchten. Auf diese Weise können Sie die Ausgabe auf verschiedene Arten überprüfen (sogar von einer anderen Maschine), ohne sich mit dem Programm, das die Ausgabe erzeugt, zu stören.

Beachten Sie, 2>&1dass Bash-spezifisch sein kann (ich bin mir nicht sicher). Stellen Sie sicher, dass Sie über ausreichend Speicherplatz für die Ausgabedatei verfügen :-)

Tail zeigt Ihnen nur die Datei. Ed hat angegeben, dass er weniger interaktiv verwendet wird (z. B. muss er in der Datei suchen). Matteo vor 12 Jahren 0
"2> & 1" ist POSIX, bloßes ">" ist ein Bashmus. grawity vor 12 Jahren 0
FWIW, 2> & 1 funktioniert auch unter Windows XP, 7, 2008 usw. jftuga vor 12 Jahren 0
@ Matteo: Ja, ich hätte in meinem Beispiel 'less + F' verwenden sollen; Ich habe gerade meine Antwort aktualisiert. jrennie vor 12 Jahren 0
Mit "less + F" wird die Zeilenzählung nicht deaktiviert. Wenn die Datei sehr groß ist, dauert dies auf jeden Fall einige Zeit. Und es hat auch das gleiche Problem wie ursprünglich geschrieben: Es ist nicht möglich, im laufenden Betrieb zu suchen. Sie müssen die Tastenkombination Strg + C drücken, um den Befehl less anzuhalten ("Warten auf Daten ... (Unterbrechung zum Abbruch)". . Wenn Sie suchen möchten, müssen Sie die Tastenkombination Strg + c drücken, den Folgemodus suchen und dann wieder aktivieren. Matteo vor 12 Jahren 0
@ Matteo: Die Zeilenzählung ist bei "less + F" nicht das gleiche Problem (da "less + F" die Daten verarbeitet, während sie generiert werden). Das Beispiel, das ich gegeben habe, hat nicht das gleiche Problem wie ursprünglich geschrieben: Strg + c unterbricht `process_output` nicht. Wenn man sich nicht für die 'Follow'-Funktion interessiert, kann man `product_output> out 2> & 1` ausführen, dann` less out`. Ein Problem mit `Erzeugnisausgabe | less ist, dass, wenn etwas die Pfeife bricht (z. B. versehentliches "q" von "less"), dann "create_output" stirbt (ohne spezielle SIGPIPE-Behandlung). jrennie vor 12 Jahren 1
@jrennie Das ursprüngliche Problem besteht darin, dass der Benutzer die Zeilenzählung unterbrechen musste, da er nicht benötigt wurde und die Suche dadurch langsamer wurde (der Benutzer musste warten). Mit "less + F" werden auch Zeilen gezählt und entsprechend dem Handbuch werden mehrere Operationen langsamer. Wenn Sie in Ihrem letzten Kommentar "less out" verwenden, wird das "control-C" -Problem gelöst. Warum sollten Sie jedoch weniger mit der Zeilenzählung beginnen und diese dann unterbrechen? Sie können ohne Zeilenzählung einfach weniger anfangen und sind fertig. Matteo vor 12 Jahren 0
0
Eric Woodruff

Sie können dies auch einfach tun:

less +F -f <(produce_output)