web-dev-qa-db-fra.com

Comment tuer un chat en fuite?

Plusieurs fois, j'exécute accidentellement la commande cat sur des fichiers dont le contenu peut atteindre quelques milliers de lignes.

J'essaie de tuer la commande cat avec CtrlC ou Ctrl+Z, mais les deux ne prennent effet qu'après l'affichage de la sortie totale de cat dans le terminal, je dois donc attendre que cat soit complètement exécuté.

Existe-t-il une meilleure solution qui évite d'attendre? Parce que parfois les fichiers ont une taille de 100 Mo, et cela devient irritant de l'attendre.

J'utilise tcsh.

129
JigarGandhi

Si le ou les fichiers en question contiennent vraiment beaucoup de données, l'envoi du signal peut en fait arriver à cat avant la fin. Ce que vous observez vraiment, c'est la vitesse finie de votre terminal - cat envoie les données au terminal et il faut un certain temps au terminal pour les afficher toutes.

Rappelez-vous qu'en général, il doit en quelque sorte redessiner toute la fenêtre de sortie pour chaque ligne de sortie (c'est-à-dire déplacer le contenu de la fenêtre d'une ligne vers le haut et imprimer la ligne suivante en bas). Bien qu'il existe des techniques et des algorithmes pour rendre cela plus rapide que si cela était fait de manière simple, cela prend encore un certain temps.

Ainsi, si vous souhaitez vous débarrasser de la sortie le plus rapidement possible, masquer la fenêtre du terminal, car alors généralement aucun redessin réel n'a lieu. Dans un environnement graphique, cela peut signifier soit minimiser la fenêtre ou basculer vers un autre bureau virtuel, sur la console virtuelle Linux, basculez simplement sur un autre ((Ctrl +)Alt + Fx).

Notez également que si vous exécutiez cela sur une liaison réseau lente (SSH sur une connexion GSM par exemple), vous verriez certainement beaucoup moins de sortie avant que cat ne soit tué par le signal, car la vitesse du terminal ne le ferait pas. t être le goulot d'étranglement plus.

76
peterph

Configuration du terminal

Je pense que cela est plus lié à la configuration du terminal qu'à tout problème de mise en mémoire tampon. Vérifiez la sortie de stty -a | grep intr, tu aurais dû intr = ^C; sur la ligne de sortie si Ctrl-C est activé dans tty/pty. Si ce n'est pas le cas, vous pouvez utiliser stty intr ^C pour l'activer. Ajoutez la ligne à votre .tcshrc ou .login pour le rendre permanent (ou supprimez la ligne qui le change en premier lieu!).

Échouer Ctrl-C, vous pouvez également essayer d'envoyer SIGQUIT avec Ctrl-\. Si cela ne fonctionne pas, vérifiez à nouveau stty -a | grep quit pour voir s'il est correctement configuré.

Configuration de l'émulateur de terminal

Vérifiez également les paramètres de votre émulateur de terminal (si vous en utilisez un), il se peut qu'il y ait un raccourci configuré à ce niveau (peut-être pour la copie ou quelque chose) et le Ctrl-C n'atteint pas le niveau pty. Un raccourci peut également être configuré ailleurs dans votre environnement de bureau ou votre système Windows.

Un bon test sous Linux si vous utilisez un émulateur de terminal est de passer à une console Linux (Ctrl-Alt-F1), connectez-vous là-bas et voyez si le même comportement se produit. Si ce n'est pas le cas, cela suggère que le problème vient de votre système Windows ou de votre émulateur de terminal.

Cela pourrait être un problème avec le délai entre la lecture des données à partir du périphérique pty comme suggéré par peterph . Mais si c'est le cas et que vous devez réellement attendre des minutes pour que les données s'affichent, alors l'émulateur de terminal met en mémoire tampon de manière trop de données (ou votre PC est très lent). La réponse serait de trouver un moyen de réduire cette taille de tampon dans les paramètres de votre émulateur de terminal ou d'en utiliser un autre.

Astuce supplémentaire

Quelque chose d'autre mérite d'être ajouté; Je me retrouve généralement dans la situation d'emballement cat lorsque si accidentellement cat un fichier binaire. L'autre effet de cela peut être de bousiller vos paramètres de terminal (si les données binaires correspondent à divers codes d'échappement de terminal, ce qui est souvent le cas). Si tput est installé (généralement par défaut), vous pouvez éviter d'avoir à redémarrer avec la commande suivante:

tput reset
4
Graeme

C'est ce que tmux option c0-change-interval et c0-change-trigger conçu pour. Vous devez de toute façon utiliser un gestionnaire d'écran pour reprendre la session.

3
J-16 SDiZ

Le Ctrl-O L'option est sous Unix depuis les 110 jours de bauds. Les commandes cat Runaway ont toujours été un problème lorsqu'un long fichier ASCII a été vidé sur le périphérique de sortie lente et le fichier entier placé dans le tampon de sortie du pilote de périphérique. Ctrl-O commencerait le vidage du tampon et un suivi Ctrl-O basculerait la chasse pour que le chat puisse être lu à vitesse normale. Ctrl-O a été entré et le fichier entier serait vider et retourner rapidement une invite de commande.

On ignore si les codeurs de pilotes de périphériques Linux ont ressenti le besoin de continuer à ajouter cette fonctionnalité. Cette fonctionnalité a été ajoutée au niveau du pilote de périphérique où Ctrl-S et Ctrl-Q ne pouvait être mis en œuvre. J'ai utilisé cela pour vider de grandes séries de débogage avec beaucoup d'impressions de chèques, puis faire défiler jusqu'à l'endroit que je devais voir.

1
user62612