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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 tput reset 

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

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

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

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

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

 killall -9 cat 

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

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

Сбросить использование экрана ctrlj

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