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

11

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

сумасшедший
источник

Ответы:

21

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

Мирча Вуцовичи
источник
2

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

Оттуда вы можете сделать листинг процесса следующим образом:

ps aux | grep <process-name>

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

kill -9 <pid>

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

кроличий садок
источник
1

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

Я лично хотел послать SIGKILL с ярлыком, но я не знаю, как это сделать.

Тим Бригам
источник
1

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

belacqua
источник
0

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

Билл Вайс
источник
0

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

vineeshvs
источник