Что делать, если Ctrl-C не убивает запущенную работу?


98

Иногда процессы игнорируют сигнал SIGINT, отправленный Ctrl- Cв Bash. Например, manи vi. Предполагая, что вы не хотите гуглить или читать руководство по выходу из запущенного процесса, есть ли какая-нибудь последовательность клавиш, которая всегда будет работать (не выходя из терминала)?

Ответы:


141

Отправьте сигнал SIGQUIT с помощью Ctrl+ \.

.. $ sleep 10
^\Quit

→ Это эквивалентно kill -3 pid. Программы, запускаемые в пользовательском пространстве, не игнорируют сигнатуры.

Существует также набор сочетаний клавиш Magic SysRq . Один из наиболее интересных из них: Alt+ SysRq+ k. Это убивает каждый процесс на текущей виртуальной консоли. Если один из ваших ttys полностью и полностью сломан, это может быть использовано для возврата . На tty, работающем с X.org, его можно использовать, чтобы убить Х без пощады.

Клавиша SysRq на большинстве клавиатур такая же, как клавиша печати. На моем ноутбуке его можно вызвать с помощью клавиши Fn; Т.е. Alt → Fn → Print → k в этом порядке.

Вот некоторые из основных ярлыков управления процессами:

  • Ctrl+ Z: приостановить процесс (плюс bgвозобновить в фоновом режиме, fgподнять на передний план)
  • Ctrl+ C: вежливо попросить процесс завершить работу сейчас
  • Ctrl+ \: беспощадно убивать процесс, который в данный момент находится на переднем плане
  • Alt+ SysRq+ s: Записать данные на диск (всегда делайте это перед тем, как убить что-нибудь важное)
  • Alt+ SysRq+ s, k: Безжалостно убивает все текущие процессы на данной виртуальной консоли
  • Alt+ SysRq+ s, b: Безжалостно перезагрузиться без размонтирования,
  • Alt+ SysRq+ r, e, i, s, u, b: Безопасный г Eboot х VEN я е в ы ystem является у tterly б roken,

Примечание: Ctrl+ Z, в отличие от Ctrl+ Cи Ctrl+ \, также работает man, vi, lessи тому подобное.

Если есть сомнения, следующая процедура будет почти всегда работать:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z, конечно, означает, что Ctrl+ Zбыл нажат.


Для более глубокого взгляда на Оболочки и Терминалы, также посмотрите мои ответы на:


3
Работает для «сна 10», но все еще не работает для «человека» или «vi». Очевидно, что "kill -9 pid" работает на уничтожение обоих процессов. Я что-то пропустил?
— Оливье Лалонд

3
Ctrl + Z работает с такими вещами, как less, man, vi и так далее. Вы можете убить их, делая , psчтобы увидеть их идентификатор процесса и убить их с помощью kill pidили, если вы не заботитесь о других экземплярах программы, killall vi. В любом случае, Ctrl-Z всегда работает.
— Стефано Палаццо

5
Вы также можете сделать, kill %%чтобы убить последнюю работу, и kill %5где 5 - номер работы, показанный на jobs.
— Оливье Лалонд

2
Ctrl- \ отправляет SIGQUIT , а не SIGKILL. Есть несколько важных различий между SIGQUIT и SIGKILL. ru.wikipedia.org/wiki/SIGQUIT
— Джулиано,

4
Как нажать Ctrl+, \ если \ в раскладке клавиатуры нет клавиши?
— Форивин


8

Иногда CTRL+Cотправляется не в ту программу или входной канал. Это особенно часто встречается в редакторах, таких как viкоманды с конвейерным выводом, сложные команды bash, включающие циклы и т. Д.

Простое и быстрое решение - приостановить работу, CTRL+Zа затем убить ее по номеру работы: kill %1или kill -9 %1и т. Д.


6
  • Попробуйте один из них:

    Ctrl+4

    Ctrl+\


  • Или же:

    Ctrl+ Zи запустите:

    kill %1

Где %1номер задания, которое было возвращено, когда вы нажали Control- Z. Добавьте, -9чтобы заставить убить.


Когда вы в текстовой консоли, вы можете попробовать: Ctrl- SysRq. Ядро должно убить процесс.

Или SysRq- kубить все процессы на текущей виртуальной консоли (можно также убить программы X и svgalib).

Примечание. Когда магические ключи SysRq используются для уничтожения замороженной графической программы, программа не имеет возможности восстановить текстовый режим. Это может сделать все нечитаемым.

См .: Ключ Magic SysRq и его комбинации команд.


3

Чтобы выйти из человека , используйте q Чтобы оставить Vi использовать:q


0

Возможно, вы изменили ярлык копии с:

CTRL+ SHIFT+C

к

CTRL+C

Таким образом, когда вы пытаетесь убить процесс, CTRL+ Cне работает.

Попробуйте заменить копию ярлыка на CTRL+ SHIFT+ C.


1
Изменение ярлыка копирования не имеет значения для принудительного завершения процесса!
— Суббота

Не могли бы вы немного расширить свой ответ? Шаг за шагом будет идеальным, прежде всего, чтобы ОП мог следовать вашему предложению. :)
— ThatGuy

Это действительно помогло мне. Я привык к CTRL + C на MacOS и не знал, что команда Ubuntu была CTRL + SHIFT + C
— ratskin

-1

Попробуй Ctrl+ Alt+Backspace

Если вы используете Ubuntu 10.04, вы хотите, чтобы этот ключ работал.

Чтобы включить Control- Alt-Backspace

Перейти в Система -> Настройки -> Клавиатура

Выберите вкладку «Макеты» и нажмите « Параметры макета» .

Выберите последовательность клавиш, чтобы убить X-сервер и включить Control+ Alt+Backspace .

Примечание:

Нажатие Ctrl- Alt- Backspaceперезапустит ваш X-сервер.


Отредактировал вопрос, чтобы было понятно, что я хочу убить процесс из терминала.
— Оливье Лалонд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.