Я знаю, что есть ctrl kbd> + c kbd>, но иногда это не работает. В настольном компьютере Ubuntu я могу просто закрыть окно терминала и открыть новое, когда это произойдет, но как это можно решить с помощью CLI на сервере Ubuntu (без перезапуска коробки)?
CTRL + C отправит SIGINT
приложению. Приложение может настроить обработчик для этого сигнала или может игнорировать сигнал. По умолчанию обработчик отсутствует, и SIGINT
убьет приложение.
Вы можете использовать CTRL + \ , который отправит SIGQUIT
. Это также создаст дамп ядра, если предел ядра не равен нулю.
Вы можете приостановить процесс и вернуться в оболочку с помощью CTRL + Z , это остановит выполнение процесс и вернуться в командную строку оболочки. Процесс будет в памяти и будет доступен как задание в текущей оболочке. Затем вы можете использовать kill -SIGNAL %%
или kill -SIGNAL%
, чтобы отправить сигнал этому заданию. Например. чтобы убить последнее задание, используйте kill -9 %%
Если ни один из них не работает, вы всегда можете отправить SIGTERM
, а затем, в крайнем случае, SIGKILL
, который будет прекратить любой процесс. Этот сигнал, как и любые другие сигналы, должен быть отправлен от имени того же пользователя, что и процесс, который вы пытаетесь остановить, или от имени пользователя root. Чтобы отправить SIGKILL
процессу, сначала найдите процесс с помощью ps aux
или ps -edf
, затем запустите kill -SIGKILL
, где
- это столбец PID
в выводе ps
.
Сигналы не могут быть доставлены, если процесс находится в непрерывном вызове. Бесперебойные вызовы - это функции ядра, которые не могут быть остановлены и обычно происходят из-за плохого драйвера (например, драйвера, который не повторно входим ). Процесс, который находится в непрерывном спящем режиме , не может быть остановлен до тех пор, пока вызов не будет завершен или сервер не будет перезагружен.
Если процесс становится зомби , он не будет использовать никаких ресурсов только занимая место в таблице процессов. Процесс-зомби не может получать сигналы.
Список сигналов для текущей архитектуры можно найти с помощью kill -l
См. Справочные страницы kill
, ps
и bash
. Чтобы увидеть страницу руководства, используйте что-то вроде: man ps
Вы должны переключиться на новый терминал, найти PID застрявшего процесса (используя ps
), затем использовать kill
, чтобы убить процесс. Сначала я бы использовал kill (PID)
. Если это не сработает, я бы использовал kill -9 (PID)
. Если это не остановит процесс, компьютер необходимо перезагрузить.
Ответ
Cntrl + \ работал у меня (где Cntrl + c или z не работали)
Дополнительное чтение
Я обычно выполняю следующие шаги, когда Ubuntu 16.04 зависает в моем Lenovo Thinkpad E470.
вверху
, чтобы узнать, у какого процесса высокая загрузка ЦП (более 50% или около того). Запишите PID процесса. top
(нажмите q ). kill
] Завершите процесс, используя kill -9
. Ctrl C отправляет SIGINT вашему запущенному процессу. Если вы не хотите открывать другую консоль, вы можете отправить SIGQUIT с помощью Ctrl \. Это будет адресовано большинству повседневно зависших приложений, которых нет в SIGINT.
Лично мне нужен способ отправить SIGKILL с помощью ярлыка, но я не знаю, как это сделать.
Если у вас есть полный доступ к консоли, вы можете выполнить Alt - F1..12 и получить новую консоль.
Оттуда вы можете составить список процессов, как показано ниже:
ps aux | grep <process-name>
Затем выполните kill
для идентификатора процесса:
kill -9 <pid>
Если у вас нет полного доступа к консоли, просто откройте другой терминал (возможно, через PuTTY или аналогичный), и выполните перечисленные выше действия и завершите шаги.
Я считаю pgrep
и pkill
, чтобы их было проще использовать, чем kill
с явным идентификатором процесса.
Кроме того, вместо запуска с сигнала 9 (SIGKILL) рассмотрите возможность запуска с SIGTERM по умолчанию (15). Это даст процессу возможность корректно завершить работу (если это возможно).
pkill -15 thing
и pkill thing
должны быть эквивалентными.
Вот как это будет работать. Допустим, что ntpd завис.
Каковы процессы? (Вы можете перейти к pkill, если считаете, что у вас не будет ложных срабатываний).
$ pgrep -fl ntp
1034 /usr/sbin/ntpd
1037 /usr/sbin/ntpd
Завершите процессы:
$ pkill ntpd
Используйте pgrep
еще раз, чтобы убедиться, что это было успешно.
Если нет, в конце концов перейдите к pkill -9
.