Как прервать застрявшую команду на сервере Ubuntu?

Я знаю, что есть ctrl + c , но иногда это не работает. В настольном компьютере Ubuntu я могу просто закрыть окно терминала и открыть новое, когда это произойдет, но как это можно решить с помощью CLI на сервере Ubuntu (без перезапуска коробки)?

15
задан 24 April 2014 в 02:45

6 ответов

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

24
ответ дан 24 April 2014 в 02:45

Вы должны переключиться на новый терминал, найти PID застрявшего процесса (используя ps ), затем использовать kill , чтобы убить процесс. Сначала я бы использовал kill (PID) . Если это не сработает, я бы использовал kill -9 (PID) . Если это не остановит процесс, компьютер необходимо перезагрузить.

1
ответ дан 24 April 2014 в 02:45

Ответ

Cntrl + \ работал у меня (где Cntrl + c или z не работали)

Дополнительное чтение

Я обычно выполняю следующие шаги, когда Ubuntu 16.04 зависает в моем Lenovo Thinkpad E470.

  1. Перейдите в режим без графического интерфейса ( Cntrl + Alt + F1 ).
  2. Используйте вверху , чтобы узнать, у какого процесса высокая загрузка ЦП (более 50% или около того). Запишите PID процесса.
  3. Выйдите из команды top (нажмите q ).
  4. [Только если вы знаете команду kill ] Завершите процесс, используя kill -9 .
  5. Вернитесь в режим пользовательского интерфейса ( Cntrl + Alt + F7 )
1
ответ дан 24 April 2014 в 02:45

Ctrl C отправляет SIGINT вашему запущенному процессу. Если вы не хотите открывать другую консоль, вы можете отправить SIGQUIT с помощью Ctrl \. Это будет адресовано большинству повседневно зависших приложений, которых нет в SIGINT.

Лично мне нужен способ отправить SIGKILL с помощью ярлыка, но я не знаю, как это сделать.

2
ответ дан 24 April 2014 в 02:45

Если у вас есть полный доступ к консоли, вы можете выполнить Alt - F1..12 и получить новую консоль.

Оттуда вы можете составить список процессов, как показано ниже:

ps aux | grep <process-name>

Затем выполните kill для идентификатора процесса:

kill -9 <pid>

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

3
ответ дан 24 April 2014 в 02:45

Я считаю 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 .

2
ответ дан 24 April 2014 в 02:45

Другие вопросы по тегам:

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