Comment tuer un chat en fuite?

128

Plusieurs fois, j'exécute accidentellement la catcommande sur des fichiers dont le contenu ne dépasse pas quelques milliers de lignes.

J'essaie de tuer la catcommande avec Ctrl+ Cou Ctrl+ Z, mais les deux ne prennent effet qu'après l' cataffichage de la sortie totale de dans le terminal. Je dois donc attendre jusqu'à ce que la commande catsoit complètement exécutée.

Existe-t-il une meilleure solution qui évite d’attendre? Parce que, parfois, les fichiers ont une taille pouvant aller jusqu'à 100 Mo et il est agaçant d'attendre.

J'utilise tcsh.

JigarGandhi
la source
14
Utiliser des commandes telles que plus, moins, queue, tête peut être une alternative intéressante au chat. (Bien sûr, ce n'est pas une réponse ...)
mardi
25
C'était le titre de la plus grande question que j'ai jamais lu. Jusqu'à ce que je voie que le lien de la question était pour UL, je pensais que vous aviez besoin d'aide pour tuer un félin en fuite.
Lenz
5
Est-ce que soulager la question double à côté d'un autre site SE est très soulagé de voir le logo "UL" à côté de la question . Nevermind, continuez. (d'habitude, c'est Arquade qui a les titres de questions qui semblent très faussement hors contexte)
LindaJeanne
12
Je voudrais essayer la curiositycommande ...
Sekhemty
4
alias curiosity='sudo killall cat'
cas le

Réponses:

76

Si le ou les fichiers en question contiennent vraiment beaucoup de données, le signal peut être reçu catavant la fin. Ce que vous observez réellement est la vitesse finie de votre terminal: il catenvoie les données au terminal et le terminal prend un certain temps pour tout afficher.

Rappelez-vous qu’il est généralement nécessaire de redessiner la fenêtre de sortie entière pour chaque ligne de sortie (c’est-à-dire déplacer le contenu de la fenêtre d’une ligne à l’autre et imprimer la ligne suivante en bas). Bien qu'il existe des techniques et des algorithmes pour rendre cela plus rapide que si c'était fait de manière simple, cela prend encore du temps.

Ainsi, si vous souhaitez vous débarrasser le plus rapidement possible de la sortie, masquez la fenêtre du terminal , car aucun redessinage n’est effectué. Dans un environnement graphique, cela peut signifier soit de réduire la fenêtre, soit de passer à un autre bureau virtuel. Sur la console virtuelle Linux, il vous suffit de passer à un autre (( Ctrl+) Alt+ ).Fx

Notez également que si vous utilisiez cette fonction sur une liaison réseau lente (SSH via une connexion GSM, par exemple), vous auriez certainement beaucoup moins de sortie avant d' catêtre éliminé par le signal, car la vitesse du terminal ne serait plus le goulet d'étranglement .

Peterph
la source
6
Si vous attendez que les données descendent dans un tuyau SSH lent, vous pouvez utiliser la séquence d'échappement OpenSSH pour fermer la connexion. Sur une nouvelle ligne, tapez ~?pour afficher les options disponibles (se ~.ferme).
RJHunter
11
Vous essayez également d’arrêter la sortie avec Ctrl + S qui envoie tty-stop-output. Vous pouvez ensuite envoyer Ctrl + C. Pour reprendre la sortie, appuyez sur Ctrl + Q ...
Martin Tournoij
1
@Carpetsmoker Testé cela, n'a pas arrêté le flux de texte pour moi sur Ubuntu 14.04 + terminateur + zsh.
Muru
@muru Merci. J'ai essayé de le tester, mais je n'ai pas réussi à reproduire le problème (mon système est trop rapide, semble-t-il, ou peut-être que je n'ai pas fait assez d'efforts).
Martin Tournoij
4
@Carpetsmoker J'ai bien peur que le contrôle de flux logiciel (Ctrl + S) ne soit d'aucun secours dans ce cas (d'un lien de terminal rapide) - les données sont déjà dans la mémoire tampon du terminal et attendent que le terminal les traite. Par conséquent, Ctrl + S indiquera à l'application de cesser d'envoyer plus de données, mais ce qui a déjà été envoyé devra toujours être affiché.
Peter
4

Configuration du terminal

Je pense que cela a plus à voir avec la configuration du terminal qu'avec n'importe quel problème de mise en mémoire tampon. Vérifiez la sortie de stty -a | grep intr, vous devriez avoir intr = ^C;sur la ligne de sortie si Ctrl- Cest activé sur le tty/ pty. Si ce n'est pas le cas, vous pouvez utiliser stty intr ^Cpour l'activer. Ajoutez la ligne à votre .tcshrcou .loginpour la rendre permanente (ou supprimez la ligne qui la modifie en premier lieu!).

A défaut Ctrl- C, vous pouvez aussi essayer d' envoyer SIGQUITavec Ctrl- \. Si cela ne fonctionne pas, vérifiez stty -a | grep quità nouveau 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’un raccourci ait été configuré à ce niveau (peut-être pour une copie ou quelque chose d’autre) et que Ctrl- Cne parvient pas au ptyniveau. 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 consiste à basculer sur une console Linux ( Ctrl- Alt- F1), à vous y connecter et à voir si le même problème se produit. Dans le cas contraire, cela suggère que le problème provient 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 ptypériphérique, comme suggéré par peterph . Mais si tel est le cas et vous n'avez fait attendre minutes pour les données à afficher, alors sûrement l'émulateur de terminal est mise en mémoire tampon façon trop de données (ou votre PC est très lent). La solution serait de trouver un moyen de réduire cette taille de la mémoire tampon dans les paramètres de votre émulateur de terminal ou d’en utiliser un autre.

Conseil supplémentaire

Quelque chose d'autre à ajouter; Je me retrouve généralement dans la catsituation d' emballement lorsque, par mégarde, catun fichier binaire. L’autre effet peut être de bousiller les paramètres de votre terminal (si les données binaires correspondent à différents codes d’échappement de terminal, ce qui est souvent le cas). Si tputest installé (généralement par défaut), vous pouvez éviter de devoir redémarrer avec la commande suivante:

tput reset
Graeme
la source
3

C'est ce que l' tmuxoption c0-change-intervalet c0-change-triggerconçu pour. Vous devriez quand même utiliser un gestionnaire d’écran pour une session pouvant être reprise.

J-16 SDiZ
la source
1

L' option Ctrl- Oest sous Unix depuis 110 jours. Les commandes Runaway cat étaient toujours un problème lorsqu'un fichier ASCII long était vidé sur le périphérique de sortie lent et que le fichier entier était placé dans la mémoire tampon de sortie du pilote de périphérique. Ctrl- Olancerait la chasse et un suivi Ctrl- Obasculerait la chasse afin que le chat puisse être lu à vitesse normale. Ctrl- a Oété entré et le fichier entier s’est vidé et a renvoyé rapidement une invite de commande.

On ignore si les codeurs de pilotes de périphériques Linux ont estimé nécessaire de continuer à ajouter cette fonctionnalité. Cette fonctionnalité a été ajoutée au niveau du pilote de périphérique où Ctrl- Set Ctrl- Qn'a pu être implémenté. J'ai utilisé cela pour vider de grandes exécutions de débogage avec beaucoup d'impression de chèques, puis faire défiler jusqu'à l'endroit que j'avais besoin de voir.

utilisateur62612
la source
Ctrl-O ne semble pas être implémenté dans les Linux modernes, du moins pas le serveur RHEL ou Ubuntu.
dotancohen
-1

Lorsque vous utilisez bash, vous pouvez suspendre le travail à l’aide de Ctrl+ Zpuis le tuer, soit à l’aide du PID, soit en suivant les réponses fournies à l’ adresse https://stackoverflow.com/questions/1624691/linux-kill-background-task (par exemple, kill -9 %%)

Jannis
la source
3
mais j'utilise tcshet Ctrl + Z ne fonctionne pas ... déjà indiqué que dans la question.
JigarGandhi
oui, désolé, je n'ai pas lu dans votre message que vous avez essayé Ctrl + Z et j'ai supposé à tort que Ctrl + Z est géré par le shell contrairement à Ctrl + C qui est géré par l'application. C'est pourquoi j'ai pensé que Ctrl + Z fonctionnait instantanément, contrairement à Ctrl + C.
Jannis
-1

ouvrez une nouvelle console, par exemple en cliquant sur l’icône de la console ou en appuyant sur Ctrl+ Alt+ F2. Là, entrez

killall -9 cat

et le chat sera tué à moins que vous n'ayez un verrou NFS périmé ou une situation de "sommeil ininterruptible" (à lire sur un secteur défectueux sans délai d'expiration défini).

Thorsten Staerk
la source
10
Le problème ne concerne pas cat, il concerne ce qui cata été écrit sur le terminal avant de mourir et qui n'a pas encore été lu, encore moins traité ou affiché par l'émulateur de terminal (et se trouvant dans une mémoire tampon (environ 64 ko sur Linux) dans le pilote pty) .
Stéphane Chazelas
Essayez ensuite echo 3> / proc / sys / vm / drop_caches, qui supprimera également de nombreux tampons.
Thorsten Staerk
7
Non, cela ne ferait que supprimer les données en cache, jamais de telles choses, car cela affecterait les fonctionnalités!
Stéphane Chazelas
4
@ThorstenStaerk drop_cachescontrôle les pages utilisées comme cache par le noyau (généralement pour un système de fichiers), pas les mémoires tampons internes des terminaux, les pilotes de réseau, etc. - Si cela se produisait, cela aurait des conséquences assez graves, comme le soulignait Stéphane (vous perdriez essentiellement des données). .
Peter
1
Est-ce que cela ne killall -9 cattuerait pas non plus d'autres instances de chat qui pourraient encore faire de bonnes choses dans d'autres threads de processus?
Joe
-7

Tu peux essayer avec ça

Réinitialiser l' utilisation de l'affichage -ctrlj

Si cat est toujours en cours d'exécution, ouvrez un nouveau terminal et lancez l'opération pkill -9 -f cat"Ceci va tuer tous les processus cat."

vembutech
la source
Ctrl + J ne fonctionne pas
JigarGandhi
26
pkill avec '-f cat' est assez dangereux, car -f cherchera un motif 'cat' dans les lignes de commande entières, ce qui risque de se produire et de produire des résultats non désirés ...
tonioc
2
Par exemple, pkill -f catsur mon bureau, la zone de la barre des tâches de la barre des tâches de Xfce4 serait détruite.
Marc