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


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

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

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


139
2018-02-09 08:49


происхождения


screen было бы возможным решением, позволяя вам создать новое окно и kill процесс оттуда. - Bobby
предполагая, что вы уже были на экране :) - Dustin Boswell


ответы:


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

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

 SIGINT        2       Term    Interrupt from keyboard

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

 SIGTSTP   18,20,24    Stop    Stop typed at tty

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

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

 % kill -9 PID

101
2018-02-09 09:13



Простое замечание. Остерегайтесь, что «зомби» технически является состоянием процесса, и это не то же самое, что вы имели в виду здесь «зомбирование». (Прекращенный процесс, который не был ожиданием () его родителем, находится в зомби (Z) государство. В этом случае он больше не сможет обрабатывать сигналы.) - Stéphane Gimenez
увы, иногда ctrl + c, ctrl + z и ctrl + \ ничего не делают, и процесс работает undo sudo (разрешено без пароля), поэтому вы не можете просто отправить сигнал процессу. - Michael


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


90
2018-02-09 09:36





Нажмите 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
2018-02-09 08:53



С помощью bash вы можете kill $!, в виде $! представляет собой специальную переменную, содержащую pid последней запрограммированной программы. - Lloeki
@Lloeki Не работает для меня (по крайней мере, не надежна). я должен bg один раз до того, как переменная получает назначенное значение. - Daniel Beck♦
@ Даниэль, правильно. Как я уже сказал, последний справочная информация процесса, таким образом, потребности bg как сразу после Ctrl + Z, он просто приостанавливается. - Lloeki
Примечание: это не просто трюк, используя ps вывода (или killall) весьма рискованно, если у вас несколько процессов с тем же именем. ps -e -o pid,command предоставит pid + full args, а не только имя программы, но опять-таки может оказаться недостаточно для дискриминации. В противоположность $! это верный удар. - Lloeki
@Lloeki, я не согласен. Пример выходной строки из ps a в моей системе: 27721 s000 T 0:00.09 top Сколько приостановлено (T, Я думаю) экземпляры одной и той же команды (top) у вас работает в том же tty (s000)? - Daniel Beck♦


Видеть это ссылка также.

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

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

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


21
2018-06-19 03:03





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

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

ps

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

kill -9 <Appropriate PID from ps output>

10
2018-02-09 08:53





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

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

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

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


4
2018-02-09 09:01





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

Ctrl-z      followed by     kill -9 %1

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

[1]+  Stopped                 <process name>

Обратите внимание, что «kill» - это версия kill, а не / bin / kill.


3
2018-04-18 10:41