Как убить сбежавшего кота?

128

Много раз я случайно запускал catкоманду для файлов, которые содержат до нескольких тысяч строк.

Я пытаюсь убить catкоманду с помощью Ctrl+ Cили Ctrl+ Z, но оба вступают в силу только после того, catкак в терминале отображается общий вывод , поэтому я должен ждать, пока catполностью не выполнится.

Есть ли лучшее решение, которое позволяет избежать ожидания? Потому что иногда файлы имеют размер до 100 МБ, и их раздражает ожидание.

Я использую tcsh.

JigarGandhi
источник
14
Использование таких команд, как more, less, tail, head может быть интересной альтернативой cat. (конечно, это не ответ ...)
tonioc
25
Это был самый большой вопрос, который я когда-либо читал. Пока я не увидел, что ссылка на вопрос касается UL, я думал, что вам нужна помощь в убийстве убегающей кошки.
Lenz
5
Делает ли двойной ответ на вопрос на боковой панели с другого сайта SE очень приятно видеть логотип "UL" рядом с вопросом . Неважно, продолжай. (обычно это Arquade, у которого заголовки вопросов выглядят очень неправильно, вне контекста)
LindaJeanne
12
Я бы попробовал curiosityкоманду ...
Sekhemty
4
alias curiosity='sudo killall cat'
Cas

Ответы:

76

Если рассматриваемый файл (-ы) содержит действительно много данных, отправляющих сигнал, он может фактически добраться catдо его завершения. Что вы действительно наблюдаете, так это конечную скорость вашего терминала - catотправляет данные на терминал, и терминалу требуется некоторое время, чтобы отобразить все это.

Помните, что обычно необходимо каким-то образом перерисовывать все окно вывода для каждой строки вывода (т.е. перемещать содержимое окна на одну строку вверх и печатать следующую строку внизу). Хотя есть методы и алгоритмы, которые делают это быстрее, чем если бы это было сделано простым способом, это все же занимает некоторое время.

Таким образом, если вы хотите избавиться от вывода как можно быстрее, спрячьте окно терминала , потому что тогда обычно не происходит никакого реального перерисовывания. В графической среде это может означать либо сворачивание окна, либо переключение на другой виртуальный рабочий стол, на виртуальной консоли Linux просто переключитесь на другую (( Ctrl+) Alt+ ).Fx

Также обратите внимание, что если вы запускаете это по медленному сетевому каналу (например, SSH через GSM-соединение), вы наверняка увидите намного меньше выходного сигнала до того cat, как сигнал прекратится, потому что скорость терминала больше не будет узким местом. ,

peterph
источник
6
Если вы ожидаете, что данные пройдут по медленному каналу SSH, вы можете использовать escape-последовательность OpenSSH, чтобы закрыть соединение. В новой строке введите, ~?чтобы увидеть доступные параметры ( ~.закрывается).
RJHunter
11
Вы также пытаетесь остановить вывод с помощью Ctrl + S, который отправляет tty-stop-output. Затем вы можете отправить Ctrl + C. Чтобы возобновить вывод, нажмите Ctrl + Q ...
Martin Tournoij
1
@Carpetsmoker Протестировал это, не остановил поток текста для меня на Ubuntu 14.04 + терминатор + zsh.
Муру
@ Муру Спасибо. Я пытался протестировать его, но не смог воспроизвести проблему (кажется, моя система слишком быстрая, или, может быть, я недостаточно старался).
Мартин Турной
4
@Carpetsmoker Боюсь, что программное управление потоком (то есть Ctrl + S) не очень поможет в этом случае (для быстрой связи с терминалом) - данные уже находятся в буфере терминала и ждут, пока терминал его обработает. Следовательно, Ctrl + S скажет приложению прекратить отправку большего количества данных, но то, что уже было отправлено, все равно будет отображаться.
Петер
4

Настройка терминала

Я считаю, что это больше связано с тем, как настроен терминал, чем с любой проблемой буферизации. Проверьте выходные данные stty -a | grep intr, вы должны иметь intr = ^C;в выходной строке, если Ctrl- Cвключен в tty/ pty. Если это не так, вы можете использовать, stty intr ^Cчтобы включить его. Добавьте строку в ваш .tcshrcили, .loginчтобы сделать ее постоянной (или удалите строку, которая меняет ее в первую очередь!).

В противном случае Ctrl- Cвы также можете попробовать отправить SIGQUITс Ctrl- \. Если это не работает, еще раз проверьте, stty -a | grep quitправильно ли он настроен.

Настройка эмулятора терминала

Также проверьте настройки для вашего эмулятора терминала (если вы его используете), возможно, на этом уровне настроен ярлык (возможно, для копирования или чего-то еще), а - Ctrl- Cне достигает ptyуровня. Ярлык также может быть установлен где-то еще в вашей среде рабочего стола или в системе Windows.

Хорошим тестом для Linux, если вы используете эмулятор терминала, является переключение на консоль Linux ( Ctrl- Alt- F1), войдите в систему и посмотрите, происходит ли то же самое. Если этого не произойдет, значит, проблема в вашей оконной системе или эмуляторе терминала.

Это может быть проблемой с задержкой между считыванием данных с ptyустройства, как это было предложено peterph . Но если это так , и вы на самом деле приходится ждать минут данные , которые будут отображаться, то , конечно, эмулятор терминала буферизация путь слишком много данных (или ваш компьютер очень медленно). Ответ заключается в том, чтобы найти способ уменьшить размер буфера в настройках эмулятора терминала или использовать другой.

Дополнительный совет

Что-то еще стоит добавить; Я обычно оказываюсь в безудержной catситуации, когда я случайно catбинарный файл. Другим эффектом этого может быть испортить настройки терминала (если двоичные данные совпадают с различными кодами выхода терминала, что часто происходит). Если tputустановлено (обычно по умолчанию), вы можете избежать перезагрузки с помощью следующей команды:

tput reset
Graeme
источник
3

Это то, что tmuxвариант c0-change-intervalи c0-change-triggerпредназначен для. Вы все равно должны использовать менеджер экрана для возобновления сеанса.

J-16 SDiZ
источник
1

Опция Ctrl- Oиспользуется в Unix с 110 бод. Команды Runaway cat всегда были проблемой, когда длинный медленный файл ASCII был выгружен на медленном устройстве вывода, а весь файл помещался в выходной буфер драйвера устройства. Ctrl- Oзапускает очистку буфера и последующее наблюдение Ctrl- Oотключает очистку, чтобы кот мог читать с нормальной скоростью. Ctrl- Oбыл введен, и весь файл будет очищен и быстро вернет командную строку.

Чувствовали ли кодировщики драйверов устройств Linux необходимость продолжать добавлять эту функцию, неизвестно. Эта функция была добавлена ​​на уровне драйвера устройства, где Ctrl- Sи Ctrl- Qможет быть реализовано только. Я использовал это, чтобы выгрузить большие отладочные прогоны с большим количеством чековой печати, а затем прокрутить вниз до места, которое мне нужно было увидеть.

user62612
источник
Ctrl-O, кажется, не реализован в современных Linux, по крайней мере, не RHEL или сервер Ubuntu.
dotancohen
-1

При использовании bash вы можете приостановить работу, используя Ctrl+, Zа затем убить ее, используя PID или следуя ответам на https://stackoverflow.com/questions/1624691/linux-kill-background-task (например, kill -9 %%)

Jannis
источник
3
но я использую tcshи Ctrl + Z не работает ... уже было сказано , что в вопросе.
ДжигарГанди
да, извините, не читал в вашем посте, что вы пробовали Ctrl + Z, и я ошибочно предположил, что Ctrl + Z обрабатывается оболочкой в ​​отличие от Ctrl + C, который обрабатывается приложением. Вот почему я думал, что Ctrl + Z работает мгновенно, а Ctrl + C - нет.
Яннис
-1

откройте новую консоль, например, нажав на значок консоли или нажав Ctrl+ Alt+ F2. Там введите

killall -9 cat

и cat будет убит, если у вас нет устаревшей блокировки NFS или ситуации "непрерывного сна" (чтение в плохом секторе без тайм-аута).

Торстен Стэрк
источник
10
Проблема не в том cat, что речь идет о том, что catбыло записано в терминал перед смертью и еще не было прочитано, не говоря уже о том, что оно обрабатывалось или отображалось эмулятором терминала (и находится в буфере (около 64 кБ в Linux) внутри драйвера pty) ,
Стефан Шазелас
Тогда, пожалуйста, попробуйте echo 3> / proc / sys / vm / drop_caches, который также удалит много буферов.
Торстен Стаерк
7
Нет, это приведет к удалению только кэшированных данных, но это не повлияет на функциональность!
Стефан Шазелас
4
@ThorstenStaerk drop_cachesуправляет страницами, используемыми ядром в качестве кэша (обычно для файловой системы), а не внутренними буферами терминалов, сетевыми драйверами и тому подобным - в противном случае это имело бы весьма серьезные последствия, как указал Стефан (в основном вы потеряете данные) ,
Петер
1
Не killall -9 catуничтожит ли также другие экземпляры cat, которые все еще могут делать хорошие вещи в других потоках процесса?
Джо
-7

Вы можете попробовать с этим

Сброс дисплея использование ctrl-j

Если cat все еще работает, откройте новый терминал и запустите pkill -9 -f cat«Это убьет все процессы cat».

vembutech
источник
Ctrl + J не работает
JigarGandhi
26
pkill с '-f cat' довольно опасен, так как -f будет искать шаблон 'cat' во всех командных строках, который может произойти и привести к нежелательным результатам ...
tonioc
2
Например, pkill -f catна моем рабочем столе будет убита область панели задач панели задач Xfce4.
Марк