Что делать, если 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+, \ если \ в раскладке клавиатуры нет клавиши?
Форивин
14

Вы можете попробовать Ctrl+\

Вениамин
источник
1
Не работает ни с manили vi.
Бегемот
1
работал убунту 16.04
kRazzy R
8

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

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

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

    Ctrl+4

    Ctrl+\


  • Или же:

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

    kill %1

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


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

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

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

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

kenorb
источник
3

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

antivirtel
источник
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-сервер.

karthick87
источник
Отредактировал вопрос, чтобы было понятно, что я хочу убить процесс из терминала.
Оливье Лалонд