Moins d'interruption en moins

13

Je redirige souvent la sortie du programme vers moins, par exemple

produce_output | less

Cela fonctionne très bien, jusqu'à ce qu'il produce_outputproduise de grandes quantités de sortie. Si je recherche du texte au fond du fichier, moins de rapports

Calculating line numbers... (interrupt to abort)

Si j'interromps avec Control + C, il tue également produce_output, ce qui l'empêche de produire une sortie supplémentaire. Existe-t-il un moyen d'envoyer l'interruption à moins, afin que cela produce_outputcontinue?

Je sais que je pourrais utiliser kill -INT less_process, mais je pense qu'il doit y avoir une meilleure solution.

Ed McMan
la source

Réponses:

15

Normalement, tous les processus d'un pipeline s'exécutent dans le même groupe de processus , ce qui entraîne qu'ils reçoivent tous le signal. Vous pouvez utiliser setsid foo | lesspour exécuter foodans un pgrp différent.

user1686
la source
À la lumière du problème soulevé par OP, il semble que la décision d'utiliser CTRL + C comme moyen d'interrompre moins soit très malheureuse. Savez-vous pourquoi ce signal spécifique a été choisi? Un autre signal serait-il moins problématique?
Piotr Dobrogost
@PiotrDobrogost: Quel autre signal suggéreriez-vous? Il n'y a pas beaucoup de raccourcis clavier dédiés, seulement SIGINT (Ctrl-C) et SIGQUIT (Ctrl- \), et ce dernier est censé quitter le programme immédiatement, pas simplement interrompre. Les autres ne sont disponibles que via kill.
user1686
Il semble que le problème soit dû à l'utilisation d'un signal pour interrompre moins. Au lieu de cela, s'il s'agissait d'une touche / d'un raccourci normal, nous n'aurions pas le problème en premier lieu. Cependant, je suppose que le besoin d'un signal vient du fait que le processus ne peut pas utiliser selectpour attendre l'entrée d'un fichier / pipe et d'un terminal en même temps.
Piotr Dobrogost
@PiotrDobrogost: C'est possible, c'est ainsi que fonctionne le Fmode (suivi). Les tuyaux et les ttys sont pollables de la même manière.
user1686
Pourquoi pensez-vous que c'est ainsi que fonctionne le mode suivi? Je pense que le flux d'événements est que le shell obtient CTRL + C et envoie un signal SIGINT à moins, ce qui obtient ce signal de manière asynchrone sans écouter le clavier / terminal.
Piotr Dobrogost
9

Vous pouvez désactiver les numéros de ligne avec le

   -n or --line-numbers

option.

produce_output | less -n
Matteo
la source
-1: peut résoudre le problème instigateur d'OP, mais ne fait rien pour répondre à la question réelle d'OP (c'est-à-dire interrompre un processus).
goldPseudo
2
Désolé mais commencer moins avec une fonctionnalité qui n'est pas souhaitée, puis essayer d'envoyer un signal pour désactiver une fonctionnalité que vous pouvez désactiver avec un commutateur est une solution de contournement et non une solution. Bien sûr, la solution @grawity est agréable (et j'ai voté pour elle) mais allez: démarrer le premier processus dans un autre groupe pour pouvoir envoyer un signal pour interrompre une tâche (comptage de lignes) qui n'est pas nécessaire est vraiment un peu trop aussi beaucoup de travail.
Matteo
1
Il s'agit d'une solution équitable au problème que j'ai posé dans ma question. Cependant, les interruptions arrêtent plus que le simple comptage de lignes en moins - par exemple, elles interrompent également une longue recherche. Ainsi, la solution de @ grawity est préférée, car elle couvrirait toute utilisation des interruptions en moins. C'est dommage de ne pas avoir abordé cela plus clairement dans la question!
Ed McMan
@EdMcMan Bien sûr, j'ai également voté pour la solution de gravité et je suis heureux d'apprendre quelque chose de nouveau qui peut toujours être utile.
Matteo
0

En travaillant avec de grandes quantités de sortie, j'ai trouvé très utile d'envoyer la sortie dans un fichier et d'utiliser tail -fou less +Fde regarder, par exemple:

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

La 2>&1syntaxe s'assure que stdout et stderr vont à out--- supprimez cela si vous voulez seulement que stdout accède au fichier. De cette façon, vous pouvez inspecter la sortie de différentes manières (même à partir d'une autre machine) sans avoir à jouer avec le programme qui produit la sortie.

Notez que cela 2>&1peut être spécifique à bash (je ne suis pas sûr). Assurez-vous que vous disposez de suffisamment d'espace disque pour le fichier de sortie :-)

jrennie
la source
Tail va juste vous montrer le fichier, Ed a précisé qu'il utilise moins interactivement (par exemple, il doit chercher dans le fichier)
Matteo
2>&1est POSIX, nu >&est un bashisme.
user1686
FWIW, 2> & 1 fonctionne également sur Windows XP, 7, 2008, etc.
jftuga
@Matteo: oui, j'aurais dû utiliser less +Fdans mon exemple; Je viens de mettre à jour ma réponse.
jrennie
1
@Matteo: Le comptage de lignes n'est pas le même problème less +F(car less +Ftraite les données telles qu'elles sont générées). L'exemple que j'ai donné n'a pas le même problème que celui publié à l'origine: ctrl + c n'interrompt pas process_output. Si l' on ne se soucie pas pour le « suivre » la fonctionnalité, on peut exécuter produce_output > out 2>&1, puis less out. Un problème avec produce_output | lessest que si quelque chose casse le tuyau (par exemple en frappant accidentellement 'q' de less), alors produce_outputil mourra (sans manipulation spéciale de SIGPIPE).
jrennie
0

Vous pouvez également faire ceci:

less +F -f <(produce_output)
Eric Woodruff
la source