Вопрос или проблема
(На OS X 10.11.3)
У меня возникла проблема с запуском java процесса, который должен слушать на порту 8040. Получаю BindException. Кажется, кто-то другой уже слушает этот порт. Быстрая проверка подтверждает это:
lsof -i TCP| fgrep LISTEN | grep 8040
jspawnhel 13566 alon 255u IPv6 0x2a5edc8fe0a093d7 0t0 TCP *:8040 (LISTEN)
jspawnhel 14482 alon 255u IPv6 0x2a5edc8fe0a093d7 0t0 TCP *:8040 (LISTEN)
jspawnhel 81770 alon 255u IPv6 0x2a5edc8fe0a093d7 0t0 TCP *:8040 (LISTEN)
Я пытаюсь выяснить, что это за процессы, но не понимаю, что показывает ps:
ps ax | grep "13566\|14482\|81770"
13566 ?? U 0:00.00 313:316
14482 ?? U 0:00.00 324:327
81770 ?? U 0:00.00 301:304
Что означает “??”? Что такое 313:316 в этом контексте?
Я не могу его завершить, даже с -9:
kill -9 13566
ps ax | grep 13566
13566 ?? U 0:00.00 313:316
Пробовал много раз…
Любая помощь будет принята с благодарностью.
Если вы запустите ps ax
без grep, вы увидите заголовки столбцов:
PID TT STAT TIME COMMAND
??
находится в столбце TT
— это управляющий терминал для процесса. ??
указывает на то, что процесс не ассоциирован с терминалом.
U
в столбце STAT
указывает на то, что процесс находится в состоянии неразрывного сна. Это объясняет, почему вы не можете его убить — он заблокирован в неразрывном сне в ядре и не может быть пробужден для завершения. Когда процесс наконец выйдет из неразрывного состояния, он заметит сигнал и завершится.
Числа справа находятся в столбце COMMAND
— это имя процесса. Что касается того, что это за процессы, я не знаю.
К сожалению, это ошибка JDK. Это проблема с JDK 13 – 20
Ошибка JDK -> https://bugs.openjdk.org/browse/JDK-8308297
Это было исправлено в версии 21
Ответ или решение
Когда вы сталкиваетесь с невозможностью завершить процессы на macOS, которые занимают порт, например, 8040, это может быть связно с несколькими аспектами работы операционной системы и конкретными характеристиками Java Development Kit (JDK), который вы используете. Давайте более подробно разберемся в этой ситуации.
Определение процессов и их состояние
Когда вы выполняете команду lsof -i TCP | fgrep LISTEN | grep 8040
, она показывает, что несколько процессов jspawnhel
слушают указанный порт. Это означает, что эти процессы активны и ожидают входящих соединений на порту 8040.
Подробный анализ вывода команды ps
Вывод ps ax | grep "13566\|14482\|81770"
показывает, что процессы находятся в состоянии U
(не прерываемый режим). Это состояние называется непрерываемым сном (uninterruptible sleep), и оно означает, что процесс в данный момент не может быть завершен, поскольку блокируется на уровне ядра. Это может происходить, например, если процесс ждет I/O операции или блокируется на системном вызове.
Параметр ??
в колонке TT
указывает на отсутствие управляющего терминала, что обычно бывает у фоновых процессов. Числа в правой части (например, 313:316
) представляют собой идентификаторы сессий, которых могут быть несколько в зависимости от системы.
Почему нельзя убить процессы
Процессы в состоянии непрерываемого сна не реагируют на сигналы завершения, такие как SIGKILL
(который используется с командой kill -9
). Они не могут быть принудительно остановлены до тех пор, пока не выйдут из состояния блокировки. Это специфическое поведение является нюансом работы с операционной системой, где операция может быть критически важной для поддержания стабильности системы.
Возможные решения
-
Перезагрузка системы: Часто наилучшее решение для устранения таких зависших процессов — перезагрузка системы. Это освободит все занятия и вернет систему в нормально рабочее состояние.
-
Обновление JDK: Поскольку вы упомянули, что используете JDK версии 13-20, стоит обратить внимание на обнаруженные ошибки, связанные с процессами
jspawnhel
. По информации из ваших источников, это проблема, которая была исправлена в JDK 21. Обновление вашего JDK до последней версии может помочь избежать повторения данной ситуации в будущем. -
Проверка на другие системные блокировки: Иногда проблемы могут быть вызваны другими программами, которые не дают завершить процессы. Лучше сделать диагностику системы для выявления потенциальных конфликтов.
Заключение
Запуск новых процессов в окружении уже занимаемого порта может столкнуться с такими же проблемами, как и вы. Не забывайте, что использование актуального программного обеспечения, а также периодические проверки и обновления системы помогут избежать многих подобных ситуаций. Удачи в решении вашей проблемы!