Что это за процессы и почему я не могу их убить?

Вопрос или проблема

(На 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). Они не могут быть принудительно остановлены до тех пор, пока не выйдут из состояния блокировки. Это специфическое поведение является нюансом работы с операционной системой, где операция может быть критически важной для поддержания стабильности системы.

Возможные решения

  1. Перезагрузка системы: Часто наилучшее решение для устранения таких зависших процессов — перезагрузка системы. Это освободит все занятия и вернет систему в нормально рабочее состояние.

  2. Обновление JDK: Поскольку вы упомянули, что используете JDK версии 13-20, стоит обратить внимание на обнаруженные ошибки, связанные с процессами jspawnhel. По информации из ваших источников, это проблема, которая была исправлена в JDK 21. Обновление вашего JDK до последней версии может помочь избежать повторения данной ситуации в будущем.

  3. Проверка на другие системные блокировки: Иногда проблемы могут быть вызваны другими программами, которые не дают завершить процессы. Лучше сделать диагностику системы для выявления потенциальных конфликтов.

Заключение

Запуск новых процессов в окружении уже занимаемого порта может столкнуться с такими же проблемами, как и вы. Не забывайте, что использование актуального программного обеспечения, а также периодические проверки и обновления системы помогут избежать многих подобных ситуаций. Удачи в решении вашей проблемы!

Оцените материал
Добавить комментарий

Капча загружается...