Как убить беглого кота?

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

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

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

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

124 голоса | спросил JigarGandhi 1 Jpm1000000pmThu, 01 Jan 2015 12:37:17 +030015 2015, 12:37:17

7 ответов


73

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

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

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

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

ответил peterph 1 Jpm1000000pmThu, 01 Jan 2015 13:45:13 +030015 2015, 13:45:13
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. Ярлык можно также настроить в другом месте в среде рабочего стола или в системе Window.

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

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

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

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

tput reset
ответил Graeme 2 Jam1000000amFri, 02 Jan 2015 11:50:01 +030015 2015, 11:50:01
3

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

ответил J-16 SDiZ 4 Jpm1000000pmSun, 04 Jan 2015 13:18:16 +030015 2015, 13:18:16
1

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

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

ответил user62612 7 Jpm1000000pmWed, 07 Jan 2015 23:41:20 +030015 2015, 23:41:20
-1

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

ответил Jannis 1 Jpm1000000pmThu, 01 Jan 2015 16:51:32 +030015 2015, 16:51:32
-1

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

killall -9 cat

, и кошка будет убита, если у вас не установлена ​​устаревшая блокировка NFS или ситуация с «бесперебойным сном» (читайте в плохом секторе без набора времени ожидания).

ответил Thorsten Staerk 1 Jpm1000000pmThu, 01 Jan 2015 22:02:59 +030015 2015, 22:02:59
-7

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

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

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

ответил vembutech 1 Jpm1000000pmThu, 01 Jan 2015 12:54:04 +030015 2015, 12:54:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132