Под Unix программы командной строки имеют большой контроль над тем, что происходит, когда вы пытаетесь прервать их с помощью ^C
.Эффект по умолчанию ввода ^C
в терминале - заставить ядро отправить сигнал SIGINT
группе процессов переднего плана, а поведение по умолчанию SIGINT
- убить процесс, в который оно отправлено, но обе эти вещиможет быть изменено.
Наиболее вероятная причина вашей проблемы заключается в том, что ваша Java-программа перехватывает SIGINT
, чтобы выполнить некоторую очистку перед выходом, но обработчик сигнала содержит ошибки, поэтому процесс на самом деле не выполняетсявыход.Второй наиболее вероятной причиной является то, что программа игнорирует SIGINT
в целом.И наименее вероятная причина в том, что он переводит терминал в «сырой режим», так что ^C
просто доставляет байт со значением 0x03 на его стандартный ввод (если бы он это сделал, ^Z
, вероятно, тоже не будет работать).
Если у вас есть доступ к исходному коду вашей программы, вы можете попытаться исправить ошибочный обработчик сигнала и / или заставить его перестать игнорировать сигнал.В противном случае, вы вроде как ручей.Вы можете попробовать ^\
(control-backslash), который отправляет другой нормально-смертельный сигнал (SIGQUIT
), но это также не гарантированно сработает, и если оно сработает, оно может выйтиу вас есть гигантский файл «core dump», от которого нужно избавиться.
Единственный 100% надежный способ избавиться от сбойного процесса - отправить ему сигнал 9 (SIGKILL
).В отличие от других смертоносных сигналов, его невозможно перехватить, заблокировать или игнорировать.Нет управляющего ключа для отправки сигнала 9;вам нужно приостановить процесс с помощью ^Z
или открыть новое окно терминала / сеанс ssh, найти идентификатор процесса с помощью ps
и использовать команду kill
.Всегда пробуйте kill PID
до kill -9 PID
.