CTRL-C не работает на Java-программе - PullRequest
2 голосов
/ 06 июля 2010

Я нашел странный сценарий, в котором, если я запускаю Java-программу и хочу изящно завершить работу с CTRL + C , она не работает / не отвечает, я должен сделать CTRL + Z в программе, и это не круто, ps перечисляет процесс ... Всем, пожалуйста.

1 Ответ

4 голосов
/ 25 августа 2010

Под 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...