暴走した猫を殺すには?


128

多くのcat場合、最大数千行の内容を持つファイルに対して誤ってコマンドを実行します。

+ または+ を使用してcatコマンドを強制終了しようとしますが、両方の合計出力が端末に表示された後にのみ有効になるため、完全に実行されるまで待つ必要があります。CtrlCCtrlZcatcat

待つことを避けるより良い解決策はありますか?なぜなら、ファイルのサイズは最大で100MBであり、それを待つのはいらいらするからです。

を使用していtcshます。


14
more、less、tail、headなどのコマンドを使用することは、catに代わる興味深い選択肢です。(もちろん、これは答えではありません...)
トニオック

25
それは私が今まで読んだ中で最大の質問タイトルでした。質問のリンクがULに関するものであることがわかるまで、私はあなたが不随のネコを殺すのを助ける必要があると思いました。
レンツ

5
別のSEサイトからのサイドバー質問でダブルテイク を行う質問の横に「UL」ロゴが表示されて非常に安心しています。気にしないで、続けて。(通常、文脈から外れた外観の質問タイトルを持っているのはArquadeです)
リンダジャンヌ

12
私はcuriosityコマンドを試してみます
...-セケムティ

4
alias curiosity='sudo killall cat'
cas

回答:


76

問題のファイルに実際に大量のデータが含まれている場合、信号はcat終了する前に実際に到達できます。実際に観察するのは、端末の有限速度です。catデータを端末に送信すると、端末がすべてを表示するのに時間がかかります。

通常、出力の各行に対して何らかの方法で出力ウィンドウ全体を再描画する必要があることを覚えておいてください(つまり、ウィンドウの内容を1行上に移動し、次の行を下部に印刷します)。これを単純な方法で行う場合よりも高速化する手法とアルゴリズムがありますが、まだ時間がかかります。

したがって、出力をできるだけ早く削除する場合は、通常は実際の再描画が行われないため、ターミナルウィンドウを非表示にします。グラフィカル環境では、これはウィンドウを最小化するか、別の仮想デスクトップに切り替えることを意味します。Linux仮想コンソールでは別の仮想デスクトップに切り替えるだけです((Ctrl+)Alt+ )。Fx

また、これを低速のネットワークリンク(たとえば、GSM接続を介したSSH)で実行した場合cat、端末の速度がボトルネックにならないため、信号によって強制終了される前に出力が大幅に少なくなることに注意してください。


6
データが遅いSSHパイプに到達するのを待っている場合は、OpenSSHエスケープシーケンスを使用して接続を閉じることができます。新しい行に入力~?して、使用可能なオプションを表示します(~.閉じる)。
RJHunter

11
また、を送信するCtrl + Sで出力を停止してみますtty-stop-output。その後、Ctrl + Cを送信できます。出力を再開するには、Ctrl + Qを押します...
Martin Tournoij

1
@Carpetsmokerは、Ubuntu 14.04 +ターミネーター+ zshでのテキストの流れを止めないことをテストしました。
ムル

@muruありがとう。私はそれをテストしようとしましたが、問題を再現することができませんでした(私のシステムが速すぎる、それは思われる、または多分私は十分に努力しなかったかもしれません)。
マーティントゥルノイ

4
@Carpetsmokerソフトウェアフロー制御(Ctrl + S)は、この場合(高速端末リンクの場合)それほど役に立ちません-データは既に端末バッファーにあり、端末が処理するのを待っています。したがって、Ctrl + Sはアプリケーションにそれ以上のデータの送信を停止するように指示しますが、既に送信されたものを表示する必要があります。
ペテルフ

4

ターミナルのセットアップ

これは、バッファリングの問題よりも、端末のセットアップ方法に関係があると考えています。出力をチェックしstty -a | grep intr、あなたが持っている必要があるintr = ^C;場合は、出力ラインにCtrl- Cで有効になっていますtty/ ptystty intr ^C有効になっていない場合は、を使用して有効にすることができます。.tcshrcまたは.loginに行を追加して(または最初に変更する行を削除してください!)。

失敗Ctrl- C、あなたはまた、送信しようとすることができSIGQUITCtrl- \。これが機能しない場合は、再度stty -a | grep quit正しく設定されているかどうかを確認してください。

ターミナルエミュレーターのセットアップ

また、(あなたがいずれかを使用している場合)端末エミュレータの設定を確認し、それが(多分コピーか何かのために)このレベルで設定したショートカットがあることをすることができ、Ctrl- C届かないptyレベル。ショートカットは、デスクトップ環境またはウィンドウシステムのどこかに設定することもできます。

(あなたは端末エミュレータを使用している場合は、Linux上で良いテストは、Linuxコンソールに切り替えることですCtrl- - AltF1そこにログインして、同じ現象が発生した場合を参照します)。表示されない場合は、Windowsシステムまたはターミナルエミュレータに問題があることを示しています。

peterphがpty示唆するように、データがデバイスから読み取られる間の遅延の問題である可能性があります。このような場合は、あなたが実際にデータを表示するために分を待つ必要がない場合でも、その後、確かに端末エミュレータをバッファリングしている途中、あまりにも多くのデータを(またはあなたのPCは非常に遅いです)。答えは、ターミナルエミュレーターの設定でそのバッファーサイズを減らすか、別のバッファーサイズを使用する方法を見つけることです。

追加のヒント

追加する価値のあるもの。バイナリファイルcatを誤っcatて使用した場合、通常は暴走状態になります。これのその他の効果は、ターミナル設定を台無しにすることです(バイナリデータがたまたまさまざまなターミナルエスケープコードと一致する場合)。tputがインストールされている場合(通常はデフォルトです)、次のコマンドを使用して再起動する必要がなくなります。

tput reset

3

これがtmuxオプションでc0-change-intervalあり、c0-change-trigger設計されたものです。いずれにしても、再開可能なセッションにはスクリーンマネージャを使用する必要があります。


1

Ctrl- Oオプションは、110ボー日以来のUnixになっています。長いASCIIファイルが低速出力デバイスにダンプされ、ファイル全体がデバイスドライバーの出力バッファーに配置された場合、暴走猫コマンドは常に問題でした。 Ctrl- Oバッファのフラッシュとフォローアップを開始しますCtrl- O猫が通常の速度で読めるようにフラッシュをオフにします。Ctrl- Oを入力すると、ファイル全体がフラッシュされ、コマンドプロンプトがすぐに返されます。

Linuxデバイスドライバーのコーダーがこの機能を追加し続ける必要があると感じたかどうかは不明です。この機能は、デバイス・ドライバ・レベルで加えたCtrl- SCtrl- Qにのみ実施することができます。これを使用して、大量のチェックプリントを含む大規模なデバッグ実行をダンプし、必要な場所までスクロールしました。


Ctrl-Oは、少なくともRHELまたはUbuntuサーバーではなく、最新のLinuxには実装されていないようです。
-dotancohen

-1

bashを使用する場合、 Ctrl+ Zを使用してジョブを中断し、PIDを使用するか、https://stackoverflow.com/questions/1624691/linux-kill-background-task からの回答に従ってジョブを強制終了できます(例:kill -9 %%)


3
しかし、私は使用してtcshおり、Ctrl + Zが機能していません...すでに問題があると述べています。
JigarGandhi

ええ、申し訳ありませんが、Ctrl + Zを試したことを投稿で読んでおらず、アプリケーションで処理されるCtrl + Cとは対照的に、Ctrl + Zがシェルによって処理されると誤って想定しました。だから、Ctrl + Zはすぐに機能し、Ctrl + Cは機能しないと思った。
ジャニス

-1

たとえば、コンソールアイコンをクリックするか、Ctrl+ Alt+を押して、新しいコンソールを開きますF2。そこに、入力してください

killall -9 cat

古くなったNFSロックまたは「割り込み不可能なスリープ」状態(タイムアウトが設定されていない不良セクタで読み取られる)がない限り、catは殺されます。


10
問題はそうではなく、死ぬ前に端末に書き込んだcatものでcatあり、端末エミュレータによって処理または表示されることはもちろん読まれていません(そしてptyドライバ内の(Linuxでは約64kiB程度)バッファに座っています) 。
ステファンシャゼラス

次に、echo 3> / proc / sys / vm / drop_cachesを試してください。これにより、多くのバッファーもドロップされます。
トールステンスターク

7
いいえ、機能に影響するので、キャッシュされたデータはドロップされません。
ステファンシャゼル

4
@ThorstenStaerk drop_cachesは、端末(ネットワークドライバーなど)の内部バッファーではなく、カーネル(通常はファイルシステム)がキャッシュとして使用するページを制御します。 。
ペテルフ

1
killall -9 cat他のプロセススレッドでまだ良いことをしている可能性のある他の猫のインスタンスも強制終了しませんか?
ジョー

-7

これで試すことができます

ディスプレイの使用をリセットします-ctrlj

catがまだ実行中の場合は、新しいターミナルを開いて pkill -9 -f cat「これはすべてのcatプロセスを強制終了します。」


Ctrl + Jが機能しない
-JigarGandhi

26
-fが発生する可能性がある全体のコマンドラインで「猫のパターンを探し、不要な結果...原因となりますので、「-f猫とpkillコマンドは、非常に危険である
tonioc

2
たとえば、pkill -f cat私のデスクトップでは、Xfce4のタスクバーのシステムトレイ領域が強制終了されます。
マーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.