Як вбити біглого кота?


128

Я багато разів випадково запускаю catкоманду на файли, які містять вміст до декількох тисяч рядків.

Я намагаюся вбити catкоманду за допомогою Ctrl+ Cабо Ctrl+ Z, але обидві вступають у дію лише після того, catяк у терміналі відобразиться загальний висновок , тому мені доведеться чекати, поки воно catповністю виконане.

Чи є краще рішення, яке дозволяє уникнути очікування? Тому що іноді файли розміром до 100 Мб, і це стає дратуючим чекати цього.

Я використовую tcsh.


14
Використання таких команд, як більше, менше, хвіст, голова може бути цікавою альтернативою кішці. (звичайно, це не відповідь ...)
tonioc

25
Це була найбільша назва запитання, яку я коли-небудь читав. Поки я не побачив, що посилання на це питання стосується UL, я подумав, що вам потрібна допомога вбивстві невдалого кота.
Ленц

5
Двічі брати на бічну панель питання з іншого веб-сайту SE Дуже полегшено побачити логотип "UL" поруч із запитанням . Не забувай, продовжуй. (як правило, це "Арквад", який має заголовки, що виглядають дуже неправильно, не в контексті)
LindaJeanne

12
Я спробував би curiosityкоманду ...
Sekhemty

4
alias curiosity='sudo killall cat'
cas

Відповіді:


76

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

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

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

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


6
Якщо ви чекаєте, коли дані зійдуть повільною трубкою SSH, ви можете використовувати послідовність запуску OpenSSH, щоб закрити з'єднання. У новому рядку введіть, ~?щоб переглянути доступні параметри ( ~.закривається).
RJHunter

11
Ви також спробуйте зупинити вихід із Ctrl + S, який надсилає tty-stop-output. Потім можна надіслати Ctrl + C. Щоб відновити вихід, натисніть Ctrl + Q ...
Martin Tournoij

1
@Carpetsmoker Випробував це, не зупинив потік тексту для мене на Ubuntu 14.04 + термінатор + zsh.
muru

@muru Спасибі Я спробував це перевірити, але не зміг відтворити проблему (моя система занадто швидка, здавалося б, або, можливо, я не намагалася досить сильно).
Мартін Турноїй

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), увійти туди і побачити, чи відбувається така ж поведінка. Якщо цього немає, це говорить про те, що проблема полягає у вашій системі Window або емуляторі терміналу.

Це може бути проблемою із затримкою між зчитуванням даних із ptyпристрою, як це запропонував peterph . Але якщо це так , і ви на самому справі доводиться чекати хвилин дані , які будуть відображатися, то , звичайно, емулятор терміналу буферизация шлях занадто багато даних (або ваш комп'ютер дуже повільно). Відповідь полягає в тому, щоб знайти спосіб зменшити розмір буфера в налаштуваннях емулятора терміналу або використовувати інший.

Додатковий рада

Ще щось, що варто додати; Я, як правило, опиняюся в утікаючій catситуації, коли випадково catбінарний файл. Інший ефект цього може полягати у виправданні налаштувань терміналу (якщо двійкові дані відповідають різним кодам виходу терміналів, що це часто відбувається). Якщо tputвстановлено (як правило, за замовчуванням), ви можете уникнути необхідності перезапуску за допомогою наступної команди:

tput reset

3

Саме для цього і розроблений tmuxваріант . У будь-якому разі слід використовувати екран-менеджер для відновлення сеансу.c0-change-intervalc0-change-trigger


1

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

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


Ctrl-O, схоже, не реалізовано в сучасних Linuxes, принаймні, не на сервері RHEL або Ubuntu.
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 + Z обробляється оболонкою на відміну від Ctrl + C, якою обробляється програма. Тому я подумав, що Ctrl + Z працює миттєво, тоді як Ctrl + C не працює.
Янніс

-1

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

killall -9 cat

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


10
Проблема не в тому cat, що catце написано в терміналі перед смертю, і його ще не прочитали, не кажучи вже обробляли або відображали емулятором терміналу (і він сидить у буфері (близько 64кіБ у Linux) всередині драйвера pty) .
Стефан Шазелас

Тоді, будь ласка, спробуйте echo 3> / proc / sys / vm / drop_caches, який також видалить багато буферів.
Торстен Стаерк

7
Ні, це лише випадає з кешованих даних ніколи подібне, як це вплине на функціональність!
Стефан Шазелас

4
@ThorstenStaerk drop_cachesкерує сторінками, які використовуються як кеш ядра (як правило, для файлової системи), а не внутрішніми буферами терміналів, драйверами мереж тощо - якщо це станеться, це матиме досить серйозні наслідки, як вказував Stéphane (в основному ви втратите дані) .
петерф

1
Хіба killall -9 catтакож не вбиватимуть будь-які інші екземпляри котів, які все ще можуть робити добрі справи в інших потоках процесів?
Джо

-7

Ви можете спробувати з цим

Скидання дисплея використання ctrl-j

Якщо кішка все ще працює, відкрийте новий термінал і запустіть це pkill -9 -f cat"Це вб'є всі котячі процеси".


Ctrl + J не працює
JigarGandhi

26
pkill з '-f cat' є досить небезпечним, оскільки -f шукатиме шаблон 'cat' у цілих командних рядках, що, швидше за все, відбудеться та спричинить небажані результати ...
tonioc

2
Наприклад, pkill -f catна моєму робочому столі буде знищено область системного лотка панелі завдань Xfce4.
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.