Wie töte ich eine außer Kontrolle geratene Katze?

128

Oft führe ich den catBefehl versehentlich für Dateien mit einem Inhalt von bis zu einigen tausend Zeilen aus.

Ich versuche, den catBefehl mit Ctrl+ Coder Ctrl+ abzubrechen Z, aber beide werden erst wirksam, nachdem die Gesamtausgabe von catim Terminal angezeigt wird. Ich muss also warten, bis sie catvollständig ausgeführt wird.

Gibt es eine bessere Lösung, die das Warten vermeidet? Denn manchmal sind die Dateien bis zu einer Größe von 100 MB groß, und es wird ärgerlich, darauf zu warten.

Ich benutze tcsh.

JigarGandhi
quelle
14
Kommandos wie more, less, tail, head können eine interessante Alternative zu cat sein. (Natürlich ist dies keine Antwort ...)
Tonioc
25
Das war der größte Fragentitel, den ich je gelesen habe. Bis ich sah, dass der Link der Frage für UL war, dachte ich, dass Sie Hilfe brauchen, um eine flüchtende Katze zu töten.
Lenz
5
Doppelte Abfrage der Seitenleiste von einer anderen SE-Site. Ist sehr erleichtert, das "UL" -Logo neben der Frage zu sehen . Vergiss nicht, mach weiter. (In der Regel ist es Arquade, die die Looks-sehr-falsch-out-of-Context-Fragentitel hat)
LindaJeanne
12
Ich würde den curiosityBefehl versuchen ...
Sekhemty
4
alias curiosity='sudo killall cat'
cas

Antworten:

76

Wenn die fraglichen Dateien wirklich viele Daten enthalten, kann das Signal tatsächlich ankommen, catbevor es beendet ist. Was Sie wirklich beobachten, ist die endliche Geschwindigkeit Ihres Terminals - catsendet die Daten an das Terminal und es dauert einige Zeit, bis das Terminal alle Daten anzeigt.

Denken Sie daran, dass normalerweise das gesamte Ausgabefenster für jede Ausgabezeile neu gezeichnet werden muss (dh verschieben Sie den Inhalt des Fensters eine Zeile nach oben und drucken Sie die nächste Zeile unten). Es gibt zwar Techniken und Algorithmen, die dies beschleunigen, als wenn es auf einfache Weise geschehen wäre, aber es dauert noch einige Zeit.

Wenn Sie also die Ausgabe so schnell wie möglich entfernen möchten, blenden Sie das Terminalfenster aus , da in der Regel kein tatsächliches Neuzeichnen stattfindet. In einer grafischen Umgebung kann dies bedeuten, entweder das Fenster zu minimieren oder auf einen anderen virtuellen Desktop zu wechseln. In der virtuellen Linux-Konsole müssen Sie nur auf einen anderen ( Ctrl+) Alt+ wechseln .Fx

Beachten Sie auch, dass Sie, wenn Sie dies über eine langsame Netzwerkverbindung (z. B. SSH über eine GSM-Verbindung) ausführen, definitiv viel weniger Ausgabe sehen würden, bevor Sie catvom Signal getötet werden, da die Geschwindigkeit des Terminals nicht mehr der Engpass wäre .

peterph
quelle
6
Wenn Sie darauf warten, dass die Daten über eine langsame SSH-Pipe übertragen werden, können Sie die OpenSSH-Escape-Sequenz verwenden, um die Verbindung zu schließen. Geben Sie in einer neuen Zeile Folgendes ein ~?, um die verfügbaren Optionen anzuzeigen (wird ~.geschlossen).
RJHunter
11
Sie versuchen auch, die Ausgabe mit Strg + S zu stoppen, die sendet tty-stop-output. Sie können dann Strg + C senden. Um die Ausgabe
fortzusetzen
1
@Carpetsmoker Getestet, dass der Textfluss für mich unter Ubuntu 14.04 + terminator + zsh nicht gestoppt wurde.
muru
@muru Danke. Ich habe versucht, es zu testen, konnte das Problem jedoch nicht reproduzieren (mein System ist anscheinend zu schnell, oder ich habe es nicht hart genug versucht).
Martin Tournoij
4
@Carpetsmoker Ich befürchte, dass die Software-Flusskontrolle (Strg + S) in diesem Fall (bei einer schnellen Terminalverbindung) nicht viel hilft - die Daten befinden sich bereits im Terminalpuffer und warten darauf, dass das Terminal sie verarbeitet. Daher weist Strg + S die Anwendung an, keine weiteren Daten mehr zu senden , was jedoch bereits gesendet wurde, muss noch angezeigt werden.
Peterph
4

Terminal Setup

Ich gehe davon aus, dass dies mehr mit der Art und Weise zu tun hat, wie das Terminal eingerichtet ist, als mit irgendwelchen Pufferungsproblemen. Überprüfen Sie die Ausgabe von stty -a | grep intr, die Sie intr = ^C;in der Ausgabezeile haben sollten, wenn Ctrl- Cam tty/ aktiviert ist pty. Wenn nicht, können Sie stty intr ^Ces aktivieren. Fügen Sie die Zeile zu Ihrem .tcshrcoder hinzu .login, um sie dauerhaft zu machen (oder löschen Sie die Zeile, die sie zuerst ändert!).

Wenn Ctrl- fehlschlägt C, können Sie auch versuchen, SIGQUITmit Ctrl- zu senden \. Wenn dies nicht funktioniert, überprüfen Sie erneut stty -a | grep quit, ob es richtig eingerichtet ist.

Terminal Emulator Setup

Überprüfen Sie auch die Einstellungen für Ihren Terminal-Emulator (falls Sie einen verwenden). Möglicherweise ist auf dieser Ebene eine Verknüpfung eingerichtet (möglicherweise für eine Kopie oder ähnliches) und das Ctrl- Cerreicht die ptyEbene nicht. Eine Verknüpfung kann auch an einer anderen Stelle in Ihrer Desktop-Umgebung oder Ihrem Windows-System eingerichtet werden.

Ein guter Test unter Linux, wenn Sie einen Terminal-Emulator verwenden, besteht darin, zu einer Linux-Konsole zu wechseln ( Ctrl- Alt- F1), sich dort anzumelden und zu prüfen , ob dasselbe Verhalten auftritt. Wenn dies nicht der Fall ist, liegt das Problem möglicherweise bei Ihrem Windows-System oder Terminal-Emulator.

Es könnte ein Problem mit der Verzögerung zwischen dem Lesen von Daten vom ptyGerät sein, wie von peterph vorgeschlagen . Aber wenn dies der Fall ist und Sie müssen tatsächlich Minuten warten , bis die Daten angezeigt werden, dann sicher das Terminal - Emulator ist Pufferung Art und Weise zu viele Daten (oder Ihr PC ist sehr langsam). Die Antwort wäre, einen Weg zu finden, um diese Puffergröße in Ihren Terminal-Emulator-Einstellungen zu reduzieren oder einen anderen zu verwenden.

Extra Tipp

Etwas anderes, das es wert ist, hinzugefügt zu werden. Normalerweise lande catich in cateiner außer Kontrolle geratenen Situation, wenn ich versehentlich eine Binärdatei habe. Der andere Effekt kann darin bestehen, die Terminaleinstellungen zu verfälschen (wenn die Binärdaten mit verschiedenen Terminal-Escape-Codes übereinstimmen, was häufig der Fall ist). Wenn tputinstalliert ist (normalerweise standardmäßig), können Sie einen Neustart mit dem folgenden Befehl vermeiden:

tput reset
Graeme
quelle
3

Dies ist , was tmuxOption c0-change-intervalund c0-change-triggerkonzipiert. Sie sollten ohnehin einen Bildschirmmanager für die fortsetzbare Sitzung verwenden.

J-16 SDiZ
quelle
1

Die Option Ctrl- Oist seit 110 Baud-Tagen unter Unix verfügbar. Runaway Cat-Befehle waren immer dann ein Problem, wenn eine lange ASCII-Datei auf dem langsamen Ausgabegerät abgelegt und die gesamte Datei im Ausgabepuffer des Gerätetreibers abgelegt wurde. Ctrl- Owürde die Spülung des Puffers starten und ein Follow-up durchführen Ctrl- Owürde die Spülung ausschalten, damit die Katze mit normaler Geschwindigkeit gelesen werden kann. Ctrl- Owurde eingegeben und die gesamte Datei wurde geleert und gab schnell eine Eingabeaufforderung zurück.

Es ist nicht bekannt, ob Linux-Gerätetreibercodierer der Ansicht sind, dass diese Funktion weiterhin hinzugefügt werden muss. Diese Funktion wurde auf Gerätetreiberebene hinzugefügt, wo Ctrl- Sund Ctrl- Qnur implementiert werden konnte. Ich habe dies verwendet, um große Debugging-Läufe mit vielen Scheckdrucken zu sichern und dann nach unten zu der Stelle zu scrollen, die ich sehen musste.

user62612
quelle
Ctrl-O scheint in modernen Linuxes nicht implementiert zu sein, zumindest nicht auf RHEL- oder Ubuntu-Servern.
Dotancohen
-1

Wenn Sie bash verwenden, können Sie den Job mit Ctrl+ anhalten Zund anschließend abbrechen. Verwenden Sie dazu entweder die PID oder folgen Sie den Antworten von https://stackoverflow.com/questions/1624691/linux-kill-background-task (z. B. kill -9) %%)

Jannis
quelle
3
aber ich benutze tcshund strg + z funktioniert nicht ... habe das schon in frage gestellt.
JigarGandhi
Ja, sorry, habe in deinem Beitrag nicht gelesen, dass du Strg + Z ausprobiert hast, und ich habe fälschlicherweise angenommen, dass Strg + Z von der Shell verarbeitet wird, im Gegensatz zu Strg + C, das von der Anwendung verarbeitet wird. Deshalb dachte ich, Strg + Z würde sofort funktionieren, Strg + C nicht.
Jannis
-1

Öffnen Sie eine neue Konsole, indem Sie beispielsweise auf das Konsolensymbol klicken oder Ctrl+ Alt+ drücken F2. Dort eintreten

killall -9 cat

und Katze wird getötet, es sei denn, Sie haben eine veraltete NFS-Sperre oder eine Situation mit "unterbrechungsfreiem Schlaf" (lesen Sie auf einem fehlerhaften Sektor ohne Zeitüberschreitung).

Thorsten Staerk
quelle
10
Das Problem liegt nicht darin cat, dass es sich um das handelt, was catvor dem Tod auf das Terminal geschrieben und noch nicht gelesen oder vom Terminalemulator angezeigt wurde (und sich in einem (unter Linux etwa 64 KB großen) Puffer im pty-Treiber befindet). .
Stéphane Chazelas
Dann versuchen Sie es mit echo 3> / proc / sys / vm / drop_caches, wodurch auch viele Puffer gelöscht werden.
Thorsten Staerk
7
Nein, das würde nur zwischengespeicherte Daten löschen, niemals solche Dinge, da dies die Funktionalität beeinträchtigen würde!
Stéphane Chazelas
4
@ThorstenStaerk drop_cacheskontrolliert die Seiten, die vom Kernel als Cache verwendet werden (normalerweise für ein Dateisystem), nicht die internen Puffer von Terminals, Netzwerktreibern und dergleichen - wenn dies der Fall wäre, hätte dies, wie Stéphane betont hat, schwerwiegende Konsequenzen (im Grunde würden Sie Daten verlieren). .
Peterph
1
Würde das nicht killall -9 catauch andere Katzeninstanzen töten, die in anderen Prozessthreads noch gute Dinge bewirken könnten?
Joe
-7

Du kannst es damit versuchen

Anzeige zurücksetzen mit ctrl-j

Wenn cat noch läuft, öffne ein neues Terminal und starte das folgende Kommando: pkill -9 -f cat"Dadurch werden alle cat-Prozesse abgebrochen."

Vembutech
quelle
Strg + J funktioniert nicht
JigarGandhi
26
pkill mit '-f cat' ist ziemlich gefährlich, da -f in ganzen Kommandozeilen nach 'cat' sucht, was wahrscheinlich zu unerwünschten Ergebnissen führt ...
tonioc
2
Zum Beispiel pkill -f catwürde auf meinem Desktop die Taskleiste von Xfce4 nicht mehr angezeigt.
Mark