Weniger unterbrechen in weniger


13

Ich leite die Programmausgabe oft auf weniger, z

produce_output | less

Dies funktioniert hervorragend, bis produce_outputgroße Mengen an Ausgabe erzeugt werden. Wenn ich nach Text suche, der tief in der Datei enthalten ist, werden weniger Berichte erstellt

Calculating line numbers... (interrupt to abort)

Wenn ich mit Strg + C unterbreche, wird auch beendet produce_output, wodurch keine weitere Ausgabe erzeugt wird. Gibt es eine Möglichkeit, den Interrupt an weniger zu senden, damit er produce_outputweiterläuft?

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

Antworten:


15

Normalerweise werden alle Prozesse in einer Pipeline in derselben Prozessgruppe ausgeführt , sodass alle das Signal empfangen. Sie können verwenden setsid foo | less, um fooin einem anderen pgrp auszuführen.


Angesichts des von OP aufgeworfenen Problems scheint die Entscheidung, STRG + C zu verwenden, um weniger zu unterbrechen, sehr unglücklich zu sein. Wissen Sie, warum dieses spezielle Signal gewählt wurde? Wäre ein anderes Signal weniger problematisch?
Piotr Dobrogost

@PiotrDobrogost: Welches andere Signal würden Sie vorschlagen? Es gibt nicht viele, die dedizierte Tastaturkürzel haben, nur SIGINT (Strg-C) und SIGQUIT (Strg- \), und letzteres soll das Programm sofort beenden und nicht nur unterbrechen. Der Rest ist nur über verfügbar kill.
user1686

Es scheint, dass das Problem durch die Verwendung von Signalen verursacht wird, um weniger zu unterbrechen. Wenn es stattdessen eine normale Taste / Verknüpfung wäre, hätten wir das Problem gar nicht erst. Ich denke jedoch, dass die Notwendigkeit eines Signals von der Tatsache herrührt, dass der Prozess nicht gleichzeitig selectauf die Eingabe von einer Datei / Pipe und einem Terminal warten kann .
Piotr Dobrogost

@PiotrDobrogost: Es kann, so funktioniert der F(Follow) -Modus. Pipes und ttys sind auf die gleiche Weise abrufbar.
Benutzer1686

Warum funktioniert der Follow-Modus Ihrer Meinung nach so? Ich denke , der Fluss der Ereignisse , dass Schale bekommt STRG + C und sendet SIGINT Signal auf weniger , die dieses Signal ohne asynchron wird hören auf Tastatur / Terminal.
Piotr Dobrogost

9

Sie können Zeilennummern mit dem deaktivieren

   -n or --line-numbers

Möglichkeit.

produce_output | less -n

-1: Löst möglicherweise das auslösende Problem von OP, unternimmt jedoch nichts, um die eigentliche Frage von OP zu beantworten (dh einen Prozess zu unterbrechen).
GoldPseudo

2
Es tut uns leid, aber weniger mit einer Funktion zu beginnen, die nicht erwünscht ist, und dann zu versuchen, ein Signal zum Deaktivieren einer Funktion zu senden, 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 dafür gestimmt), aber komm schon: Das Starten des ersten Prozesses in einer anderen Gruppe, um ein Signal zum Unterbrechen einer nicht benötigten Aufgabe (Zeilenzählung) senden zu können, ist auch ein bisschen viel Arbeit.
Matteo

1
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 der Zeilen in weniger - zum Beispiel unterbrechen sie auch eine lange Suche. Daher wird die Lösung von @ grawity bevorzugt, da sie jede Verwendung von Interrupts in weniger abdecken würde. Mein schlechtes, weil ich das in der Frage nicht klarer angesprochen habe!
Ed McMan

@EdMcMan Sicher, ich habe auch die Lösung der Schwerkraft gewählt und freue mich, etwas Neues zu lernen, das immer nützlich sein kann.
Matteo

0

Bei der Arbeit mit großen Ausgabemengen fand ich es sehr hilfreich, die Ausgabe an eine Datei zu senden und zu verwenden tail -foder less +Fzu beobachten, z.

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

Die 2>&1Syntax stellt sicher, dass sowohl stdout als auch stderr zu out--- gehen. Entfernen Sie dies, wenn Sie nur möchten, dass stdout in die Datei wechselt. Auf diese Weise können Sie die Ausgabe auf verschiedene Arten überprüfen (auch von einem anderen Computer aus), ohne sich mit dem Programm herumschlagen zu müssen, das die Ausgabe erzeugt.

Beachten Sie, dass dies 2>&1möglicherweise Bash-spezifisch ist (ich bin mir nicht sicher). Stellen Sie sicher, dass Sie genügend Speicherplatz für die Ausgabedatei haben :-)


Tail zeigt Ihnen nur die Datei, Ed hat angegeben, dass er weniger interaktiv verwendet (z. B. muss er in der Datei suchen)
Matteo

2>&1ist POSIX, nackt >&ist ein Bashismus.
user1686

FWIW, 2> & 1 funktioniert auch unter Windows XP, 7, 2008 usw.
jftuga

@Matteo: Ja, ich hätte less +Fin meinem Beispiel verwenden sollen; Ich habe gerade meine Antwort aktualisiert.
jrennie

1
@Matteo: Das Zählen von Zeilen ist nicht das gleiche Problem less +F(da less +Fdie generierten Daten verarbeitet werden). Das Beispiel, das ich gegeben habe, hat nicht das gleiche Problem wie ursprünglich gepostet: Strg + C wird nicht unterbrochen process_output. Wenn man sich nicht für die ‚folgen‘ Funktionalität schert, kann man laufen produce_output > out 2>&1, dann less out. Ein Problem dabei produce_output | lessist, dass wenn irgendetwas das Rohr bricht (z. B. versehentlich 'q' trifft less), produce_outputes stirbt (ohne spezielle SIGPIPE-Handhabung).
jrennie

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.