Ctrl + С не всегда работает, чтобы убить текущий процесс (например, если этот процесс занят определенными сетевыми операциями). В этом случае вы просто видите курсор «^ C» и больше ничего не можете сделать.
Какой самый простой способ заставить этот процесс умереть без потери моего терминала?
Резюме ответов: Обычно вы можете Ctrl + Z уложить процесс, а затем сделать kill -9 _process-pid_
где вы найдете PID процесса с п.с. и другие инструменты.
На удар (и, возможно, другие снаряды), вы можете сделать kill -9 %1
(или «% N» в целом), что проще. Если Ctrl + Z не работает, вам придется открыть другой терминал и убийство оттуда.
screen
было бы возможным решением, позволяющим создать новое окно иkill
процесс оттуда.Ответы:
Чтобы понять проблему почему Ctrl + С не работает, очень полезно понять, что происходит при нажатии:
Большинство оболочек связывают Ctrl + С "отправить SIGINT Сигнал для программы, которая в настоящее время работает на переднем плане ". Вы можете прочитать о различных сигналах через сигнал человека :
Программы могут игнорировать этот сигнал, так как они могут игнорировать SIGTSTP также:
(Что делает большинство оболочек, когда вы нажимаете Ctrl + Z , поэтому он не гарантированно работает.)
Есть некоторые сигналы, которые не могут быть проигнорированы процессом: SIGKILL , SIGSTOP и некоторые другие. Вы можете отправить эти сигналы через убийство команда. Итак, чтобы убить процесс зависания / зомби, просто найдите идентификатор процесса (ПИД). Например, используйте
pgrep
или жеps
а потомkill
Это:источник
Z
) государство. В этом случае он больше не может обрабатывать сигналы.)Если Ctrl + С (SIGINT) не работает, попробуйте Ctrl + \ (SIGQUIT). Тогда попробуй Ctrl + Z (SIGTSTP). Если это возвращает вас к приглашению оболочки, выполните
kill
на идентификатор процесса. (По умолчанию используется сигнал SIGTERM, который можно указать с помощьюkill -TERM
, В некоторых оболочках вы можете использовать%1
чтобы обратиться к PID.) Если это не сработает, перейдите на другой терминал или сеанс SSH и выполнитеkill
или жеkill -TERM
на идентификатор процесса. Только в крайнем случае если ты сделаешьkill -KILL
, a.k.a.kill -9
, поскольку он не дает процессу никакой возможности аккуратно прервать работу, синхронизировать открытые файлы, удалить временные файлы, закрыть сетевые подключения и т. д.источник
Нажмите Ctrl-Z, чтобы приостановить программу и поставить ее в фоновом режиме :
(Восстановить на передний план снова, используя
fg
)Тогда ты можешь
kill
или жеkill -9
это, учитывая его идентификатор процесса (вы получаете это отps a
).источник
kill $!
, как$!
это специальная переменная, содержащая pid последней фоновой программы.bg
один раз перед тем, как переменная получает присвоенное значение.bg
как сразу после Ctrl + Z это просто приостановлено.ps
вывод (илиkillall
) довольно рискованно, если у вас запущено несколько процессов с одним и тем же именем.ps -e -o pid,command
предоставит pid + полные аргументы, а не только имя программы, но опять же может быть недостаточно для различения. По сравнению$!
это верный удар.ps a
в моей системе:27721 s000 T 0:00.09 top
Сколько приостановлено (T
Я думаю) экземпляры одной и той же команды (top
) у вас работает в том же tty (s000
)?Видеть это ссылка на сайт также.
Ctrl + Z : приостановить процесс.
Ctrl + С : вежливо попросить процесс закрыть сейчас.
Ctrl + \ : беспощадно убить процесс, который сейчас находится на переднем плане
источник
"ctrl"
+"\"
не работал для меняОбычно вы все равно можете остановить процесс ( Ctrl + Z ), а затем использовать
kill -9
, Заkill -9
вам нужно PID процесса первый. Для фоновых заданий,kill -9 %1
это самый простой способ сделать это - если вы не уверены, какое количество фоновых заданий вы хотите убить, запуститеjobs
,Кроме того, вы можете найти идентификатор процесса с
Тогда вы можете запустить
источник
1) Если вы находитесь на консоли и в многопользовательском режиме, вы можете нажать CTRL-ALT-Fn и войти в систему на другом экране, используйте
ps -ef | grep <myprocessname>
или жеpidof <myprocessname>
а затем убить -9 процесс по номеру ID.2) Если вы подключены удаленно, сделайте то же самое через другой сеанс терминала.
Вы также можете сделать жизнь немного проще, установив HTOP , которая является более универсальной версией top, которая позволяет выборочно уничтожать запущенные процессы. Большинство дистрибутивов имеют htop в репо.
3) если вы просто застряли в зависшем сеансе ssh (например, в другой системе), попробуйте нажать тильду (~), которая является клавишей escape, и затем нажмите CTRL-Z, чтобы вернуться к сеансу хоста, затем вы может убить застрявший процесс ssh или подождать, пока он истечет время ожидания, что большинство силов делает после периода бездействия.
источник
Более простое решение для Bash (и других оболочек?) Состоит в следующем:
где «% 1» относится к убиваемому номеру задания. Это может быть "% 2" (или что-то еще), если у вас уже спят другие задания. Вы можете увидеть, какой это номер задания, когда вы нажмете Ctrl-z:
Обратите внимание, что kill - это версия kill для оболочки, а не / bin / kill.
источник
Если вы используете tmux или screen и ничего из вышеперечисленного не работает, вы все равно можете убить панель с помощью
<prefix> x
затем процесс тоже убивается.источник
Возможно, в вашем / etc / профиле установлена ловушка с SIGINT (2). Если так, удалите это. Выйдите из системы и войдите снова, и вы должны быть хорошими.
источник