2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

Что делать, если Ctrl + C не может убить процесс?

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

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

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

Ответы (9)

127
127
127
2011-02-09 09:13:54 +0000

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

Большинство оболочек связывают Ctrl + C, чтобы “послать сигнал SIGINT программе, которая в данный момент запущена на переднем плане”. О различных сигналах можно прочитать через man signal :

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 it:

% kill -9 PID
```.
119
119
119
2011-02-09 09:36:15 +0000

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

37
37
37
2012-06-19 03:03:03 +0000

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

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

Ctrl+C: вежливо попросить процесс выключить сейчас.

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

Ctrl+C: вежливо попросить процесс выключить сейчас.

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

33
33
33
2011-02-09 08:53:17 +0000

Нажмите 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).

13
13
13
2011-02-09 08:53:41 +0000

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

Или же вы можете найти ID процесса с помощью

ps

Затем вы можете запустить

kill -9 <Appropriate PID from ps output>
```.
5
5
5
2011-02-09 22:40:53 +0000

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

Ctrl-z followed by kill -9 %1

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

[1]+ Stopped <process name>

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

4
4
4
2011-02-09 09:01:45 +0000

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

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

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

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

0
0
0
2017-04-18 10:41:06 +0000

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

0
0
0
2017-10-26 13:16:30 +0000

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

Похожие вопросы

6
10
11
5
6