Я знаю, что есть ctrl+ c, но иногда это не работает. В рабочем столе Ubuntu я могу просто закрыть окно терминала и открыть новое, когда это произойдет, но как бы это решить, используя CLI на сервере Ubuntu (без перезапуска коробки)?
Я знаю, что есть ctrl+ c, но иногда это не работает. В рабочем столе Ubuntu я могу просто закрыть окно терминала и открыть новое, когда это произойдет, но как бы это решить, используя CLI на сервере Ubuntu (без перезапуска коробки)?
Ответы:
CTRL+Cотправлю SIGINT
в заявку. Приложение может настроить обработчик для этого сигнала или игнорировать сигнал. По умолчанию обработчик отсутствует и SIGINT
будет убивать приложение.
Вы можете использовать CTRL+\который отправит SIGQUIT
. Это также создаст дамп ядра, если ограничение ядра не равно нулю.
Вы можете приостановить процесс и вернуться в оболочку CTRL+Z, это остановит выполнение процесса и вернется к приглашению оболочки. Процесс будет в памяти и будет доступен как задание в текущей оболочке. Затем вы можете использовать kill -SIGNAL %%
или, kill -SIGNAL %<job_ID>
чтобы отправить сигнал на эту работу. Например, чтобы убить последнее использование работыkill -9 %%
Если ни один из них не работает, вы всегда можете отправить его SIGTERM
, в качестве последнего средства, SIGKILL
что приведет к прекращению любого процесса. Этот сигнал, как и любые другие сигналы, должен быть отправлен как тот же пользователь, что и процесс, который вы пытаетесь остановить, или как пользователь root. Чтобы отправить SIGKILL
в процесс, сначала найдите процесс с помощью ps aux
или ps -edf
, затем запустите kill -SIGKILL <process_ID>
, где <process_ID>
находится PID
столбец в ps
выводе.
Сигналы не могут быть доставлены, если процесс находится в непрерывном вызове. Непрерывные вызовы - это функции ядра, которые не могут быть остановлены и обычно происходят из-за плохого драйвера (например, драйвера, который не является повторно входящим ). Процесс, который находится в непрерывном режиме сна, не может быть остановлен до тех пор, пока не будет завершен вызов или не будет перезагружен сервер.
Если процесс становится зомби , он не будет использовать какие-либо ресурсы, занимая только место в таблице процессов. Процесс зомби не может получать сигналы.
Список сигналов для текущей архитектуры можно найти с kill -l
Смотрите справочные страницы kill
, ps
и bash
. Чтобы увидеть страницу руководства, используйте что-то вроде:man ps
Если у вас есть полный доступ к консоли, вы можете сделать Alt- F1..12и получить новую консоль.
Оттуда вы можете сделать листинг процесса следующим образом:
ps aux | grep <process-name>
Затем kill
введите идентификатор процесса:
kill -9 <pid>
Если у вас нет полного доступа к консоли, просто откройте другое окно терминала (возможно, через PuTTY или аналогичное) и выполните перечисленные выше процессы и уничтожьте шаги.
Ctrl C отправляет SIGINT вашему запущенному процессу. Если вы не хотите открывать другую консоль, вы можете отправить SIGQUIT с помощью Ctrl \. Это будет касаться большинства повседневных приложений, которые не поддерживает SIGINT.
Я лично хотел послать SIGKILL с ярлыком, но я не знаю, как это сделать.
Я считаю 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
.
Вы бы переключились на новый терминал, нашли PID застрявшего процесса (используя ps
), а затем использовали, kill
чтобы убить процесс. Я бы сначала использовал kill (PID)
. Если это не сработает, я бы использовал kill -9 (PID)
. Если это не останавливает процесс, машину необходимо перезагрузить.