155

Ctrl + C не всегда работает, чтобы убить текущий процесс (например, если этот процесс занят определенными сетевыми операциями). В этом случае вы просто видите курсор «^ C» и больше ничего не можете сделать.

Какой самый простой способ заставить этот процесс умереть без потери моего терминала?

Краткое изложение ответов: Обычно вы можете нажать Ctrl + Z, чтобы перевести процесс в спящий режим, а затем выполнить kill -9 _process-pid_ , где вы найдете pid процесса с помощью ps и других инструментов. В Bash (и, возможно, в других оболочках) вы можете kill -9 %1 (или «% N» в целом), что проще. Если Ctrl + Z не работает, вам придется открыть другой терминал и убить оттуда.

9 ответов9

108

Чтобы понять, почему Ctrl + C не работает, очень полезно понять, что происходит, когда вы нажимаете его:

Большинство оболочек связывают Ctrl + C, чтобы «отправить сигнал SIGINT программе, которая в данный момент работает на переднем плане». Вы можете прочитать о различных сигналах через сигнал человека:

 SIGINT        2       Term    Interrupt from keyboard

Программы могут игнорировать этот сигнал, также как они могут игнорировать SIGTSTP :

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Это то, что делает большинство оболочек, когда вы нажимаете Ctrl + Z, поэтому это не гарантированно работает.)

Есть некоторые сигналы, которые не могут быть проигнорированы процессом: SIGKILL, SIGSTOP и некоторые другие. Вы можете отправить эти сигналы с помощью команды kill . Итак, чтобы убить процесс зависания / зомби, просто найдите идентификатор процесса (PID). Например, используйте pgrep или ps а затем kill его:

 % kill -9 PID
103

Если Ctrl+C (SIGINT) не работает, попробуйте Ctrl+\ (SIGQUIT). Затем попробуйте Ctrl+Z (SIGTSTP). Если это возвращает вас к приглашению оболочки, kill идентификатор процесса. (По умолчанию используется сигнал SIGTERM, который можно указать с помощью kill -TERM . В некоторых оболочках вы можете использовать %1 для ссылки на PID.) Если это не сработает, перейдите в другой терминал или сеанс SSH и выполните kill или kill -TERM для идентификатора процесса. Только в крайнем случае вы должны выполнить kill -KILL , также известный как kill -9 , поскольку он не дает процессу никакой возможности аккуратно прервать выполнение, синхронизировать открытые файлы, удалить временные файлы, закрыть сетевые подключения и т.д.

30

Нажмите Ctrl-Z, чтобы приостановить программу и поместить ее в фоновый режим:

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Восстановить на передний план снова, используя fg)

Затем вы можете kill или kill -9 , учитывая его идентификатор процесса (вы получаете это из ps a).

26

Смотрите также эту ссылку .

Ctrl+Z: приостановить процесс.

Ctrl+C: вежливо попросить процесс завершить работу сейчас.

Ctrl+\: безжалостно убить процесс, который в данный момент находится на переднем плане

12

Обычно вы все еще можете остановить процесс (Ctrl + Z) и затем использовать kill -9 . Для kill -9 вам сначала понадобится PID процесса . Для фоновых заданий kill -9 %1 - самый простой способ сделать это - если вы не уверены, какое количество фоновых заданий вы хотите убить, запустите jobs .

Кроме того, вы можете найти идентификатор процесса с

ps

Тогда вы можете запустить

kill -9 <Appropriate PID from ps output>
4

1) Если вы находитесь в консоли и в многопользовательском режиме, вы можете нажать CTRL-ALT-Fn и войти в систему на другом экране, используя ps -ef | grep <myprocessname> или pidof <myprocessname> а затем уничтожить -9 процесс по ID номеру.

2) Если вы подключены удаленно, сделайте то же самое через другой сеанс терминала.

Вы также можете сделать жизнь немного проще, установив htop, более универсальную версию top, которая позволяет выборочно уничтожать запущенные процессы. Большинство дистрибутивов имеют htop в репо.

3) если вы просто застряли в зависшем сеансе ssh (например, в другой системе), попробуйте нажать тильду (~), которая является клавишей escape, и затем нажмите CTRL-Z, чтобы вернуться к сеансу хоста, затем вы может убить зависший процесс ssh или подождать, пока он истечет, что и происходит после периода бездействия.

4

Более простое решение для Bash (и других оболочек?) это сделать:

Ctrl-z      followed by     kill -9 %1

где «% 1» относится к убиваемому номеру задания. Это может быть "% 2" (или что-то еще), если у вас уже спят другие задания. Вы можете увидеть, какой это номер задания, когда вы нажмете Ctrl-z:

[1]+  Stopped                 <process name>

Обратите внимание, что 'kill' - это версия kill для оболочки, а не /bin /kill.

0

Возможно, в вашем /etc / профиле установлена ловушка с SIGINT(2). Если так, удалите это. Выйдите из системы и войдите снова, и вы должны быть хорошими.

0

Если вы используете tmux или screen и ничего из вышеперечисленного не работает, вы все равно можете убить панель с помощью <prefix> x , тогда процесс также будет убит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .