Menos interrupción en menos

13

A menudo canalizo la salida del programa a menos, por ejemplo

produce_output | less

Esto funciona muy bien, hasta que produce_outputproduce grandes cantidades de salida. Si busco texto que esté en el archivo, menos informes

Calculating line numbers... (interrupt to abort)

Si interrumpo con Control + C, también mata produce_output, lo que impide que produzca más. ¿Hay alguna forma de enviar la interrupción a menos, para que eso produce_outputsiga funcionando?

Sé que podría usar kill -INT less_process, pero creo que debe haber una mejor solución.

Ed McMan
fuente

Respuestas:

15

Normalmente, todos los procesos en una tubería se ejecutan en el mismo grupo de procesos , lo que hace que todos reciban la señal. Puede usar setsid foo | lesspara ejecutar fooen un pgrp diferente.

usuario1686
fuente
A la luz del problema planteado por OP, parece que la decisión de utilizar CTRL + C como una forma de interrumpir menos es muy lamentable. ¿Sabes por qué se eligió esta señal específica? ¿Alguna otra señal sería menos problemática?
Piotr Dobrogost
@PiotrDobrogost: ¿Qué otra señal sugerirías? No hay muchos que tengan atajos de teclado dedicados, solo SIGINT (Ctrl-C) y SIGQUIT (Ctrl- \), y este último está destinado a salir del programa inmediatamente, no simplemente a interrumpir. El resto solo está disponible a través de kill.
user1686
Parece que el problema se debe al uso de la señal para interrumpir menos. En cambio, si se tratara de una tecla / acceso directo normal , no tendríamos el problema en primer lugar. Sin embargo, supongo que la necesidad de una señal proviene del hecho de que el proceso no puede usar selectpara esperar la entrada de un archivo / tubería y terminal al mismo tiempo.
Piotr Dobrogost
@PiotrDobrogost: puede, así es como funciona el modo F(seguir). Las tuberías y los ttys son pollables de la misma manera.
user1686
¿Por qué crees que funciona así el modo de seguimiento? Creo que el flujo de eventos es que Shell obtiene CTRL + C y envía una señal SIGINT a menos, que recibe esta señal de forma asincrónica sin escuchar el teclado / terminal.
Piotr Dobrogost
9

Puede deshabilitar los números de línea con el

   -n or --line-numbers

opción.

produce_output | less -n
Matteo
fuente
-1: puede resolver el problema instigador de OP, pero no hace nada para responder la pregunta real de OP (es decir, interrumpir un proceso).
goldPseudo
2
Lo sentimos, pero comenzar menos con una función que no se desea y luego intentar enviar una señal para deshabilitar una función que puede deshabilitar con un interruptor es una solución alternativa y no una solución. Por supuesto, la solución @grawity es buena (y la voté), pero vamos: comenzar el primer proceso en otro grupo para poder enviar una señal para interrumpir una tarea (recuento de líneas) que no es necesaria es realmente un poco demasiado mucho trabajo.
Matteo
1
Esta es una solución justa al problema que planteé en mi pregunta. Sin embargo, las interrupciones detienen más que solo la línea que cuenta menos, por ejemplo, también interrumpirán una búsqueda larga. Por lo tanto, se prefiere la solución de @grawity, ya que cubriría cualquier uso de interrupciones en menos. ¡Mi mal por no abordar esto más claramente en la pregunta!
Ed McMan
@EdMcMan Claro que también voté por la solución de gravedad y estoy feliz de aprender algo nuevo que siempre puede ser útil.
Matteo
0

Al trabajar con grandes cantidades de salida, me ha resultado muy útil enviar la salida a un archivo y usarla tail -fo less +Fmirarla, por ejemplo:

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

La 2>&1sintaxis asegura que tanto stdout como stderr vayan a out--- elimínelo si solo desea que stdout vaya al archivo. De esta manera, puede inspeccionar la salida de varias maneras (incluso desde una máquina diferente) sin tener que meterse con el programa que produce la salida.

Tenga en cuenta que 2>&1puede ser específico de bash (no estoy seguro). Asegúrese de tener suficiente espacio en disco para el archivo de salida :-)

jrennie
fuente
Tail solo le mostrará el archivo, Ed especificó que está usando menos interactivamente (por ejemplo, tiene que buscar en el archivo)
Matteo
2>&1es POSIX, desnudo >&es un bashismo.
user1686
FWIW, 2> & 1 también funciona en Windows XP, 7, 2008, etc.
jftuga
@Matteo: sí, debería haberlo usado less +Fen mi ejemplo; Acabo de actualizar mi respuesta.
jrennie
1
@Matteo: el conteo de líneas no es el mismo problema con less +F(ya que less +Fprocesa los datos a medida que se generan). El ejemplo que di no tiene el mismo problema que el publicado originalmente: ctrl + c no se interrumpirá process_output. Si a uno no le importa la funcionalidad 'seguir', uno puede ejecutar produce_output > out 2>&1, entonces less out. Un problema produce_output | lesses que si algo rompe la tubería (por ejemplo, golpear accidentalmente 'q' less), entonces produce_outputmorirá (sin un manejo especial de SIGPIPE).
jrennie
0

También puedes hacer esto:

less +F -f <(produce_output)
Eric Woodruff
fuente