Глосарій/Коли щось іде не так

Порт, що прослуховується

Також: відкриті порти, що використовує порт 3000

Коротка відповідь

Порт, що прослуховується, — це мережевий порт, на якому процес чекає вхідних зʼєднань, як-от вебсервер на порту 3000. Одночасно слухати певний порт і адресу може лише один процес, тому й трапляються помилки на кшталт «address already in use».

Сервери розробки, бази даних і деякі програми відкривають порти для прослуховування. Коли ви запускаєте сервер і він не стартує, бо порт зайнято, це означає, що там досі слухає інший процес — часто попередня копія того самого сервера.

Монітор активності може показати відкриті файли й порти процесу, але найшвидше дізнатися, якому процесу належить порт, можна командою lsof у Терміналі.

Як дізнатися, що використовує порт

Виконайте lsof -nP -iTCP:3000 -sTCP:LISTEN у Терміналі, замінивши 3000 своїм портом. У виводі буде назва команди та її PID.

Щоб побачити всі TCP-порти, що прослуховуються, виконайте lsof -nP -iTCP -sTCP:LISTEN. Додайте sudo на початку, щоб охопити процеси інших користувачів.

Як звільнити порт

Якщо цей процес — сервер, який запустили ви, спершу зупиніть його звичайним способом, наприклад клавішами Control-C у терміналі, де він працює. Інакше виконайте kill <PID> з PID, який показала lsof. Використовуйте kill -9 <PID>, лише якщо процес не завершується.

Перш ніж зупиняти процес, перевірте його назву. Деякі порти належать службам macOS, наприклад «Приймачу AirPlay», який у нових версіях macOS слухає порти 5000 і 7000.

Як побачити порти в Моніторі активності

Двічі клацніть процес і відкрийте вкладку «Відкриті файли й порти». Там перелічено файли й мережеві зʼєднання, які відкрив процес.

Як читати вивід lsof

Кожен рядок — це один відкритий сокет. Сервер зазвичай показує два рядки, один для IPv4 і один для IPv6, з тим самим PID.

  • COMMAND — назва процесу, за замовчуванням обрізана до 9 символів. Додайте +c 0, щоб побачити повну назву: lsof +c 0 -nP -iTCP -sTCP:LISTEN.
  • PID — ідентифікатор процесу, який ви передаєте kill чи ps.
  • USER — обліковий запис, від імені якого працює процес. Процеси, що належать root, зазвичай є частиною macOS або встановленої служби.
  • NAME показує адресу й порт. *:3000 означає, що сервер приймає зʼєднання на всіх мережевих інтерфейсах. 127.0.0.1:3000 або [::1]:3000 означає, що підʼєднатися може лише цей Mac.

Як дізнатися, якому проєкту належить сервер розробки

Назва процесу часто просто node, python чи ruby, і це не каже, який проєкт запущено. На це відповідають дві команди.

  1. Отримайте PID командою lsof -nP -iTCP:3000 -sTCP:LISTEN.
  2. Виконайте ps -o pid,ppid,command -p <PID>, щоб побачити повну команду, яка його запустила.
  3. Виконайте lsof -a -p <PID> -d cwd, щоб побачити папку, у якій він працює, — зазвичай це папка проєкту.
  4. Якщо PPID вказує на оболонку, сервер запустили з вікна термінала. Зупиніть його там клавішами Control-C, якщо це вікно ще відкрите.

Чому порт зайнятий, хоча нічого ніби не запущено

Якщо порт належить «Приймачу AirPlay», запустіть свій сервер на іншому порту або вимкніть «Приймач AirPlay» у Системних параметрах > «Загальні», у розділі AirDrop.

  • Сервер із попереднього сеансу досі працює у вкладці чи вікні термінала, про яке ви забули.
  • Сервер запустили у фоні або з редактора чи іншого інструмента, і в нього немає видимого вікна.
  • Сервер аварійно завершився, але запущений ним дочірній процес досі утримує порт.
  • Той самий порт використовує служба macOS, наприклад «Приймач AirPlay» на портах 5000 і 7000.

Стовпець «Порти» в Моніторі активності — це не мережеві порти

У Моніторі активності на вкладці «Центральний процесор» є необовʼязковий стовпець «Порти». Він рахує порти Mach — механізм обміну повідомленнями між процесами в macOS, той самий показник, який top показує як ports. Мережевих портів він не показує. Для мережевих портів використовуйте lsof або вкладку «Відкриті файли й порти» у вікні з інформацією про процес.

Що питають люди

Як дізнатися, що використовує порт 3000 на Mac?

Виконайте lsof -nP -iTCP:3000 -sTCP:LISTEN у Терміналі. Ця команда покаже назву й PID процесу, що слухає цей порт.

Як завершити процес на певному порту на Mac?

Знайдіть його PID за допомогою lsof, а потім виконайте kill <PID>. Якщо процес не завершується, kill -9 <PID> зупинить його негайно.

Як переглянути всі відкриті порти на Mac?

Виконайте lsof -nP -iTCP -sTCP:LISTEN, щоб побачити TCP-порти, що прослуховуються. Додайте sudo, щоб охопити процеси інших користувачів.

Що означає «address already in use»?

Інший процес уже слухає цей порт і адресу. Знайдіть його командою lsof -nP -iTCP:<port> -sTCP:LISTEN, а потім зупиніть його або виберіть інший порт.

Чому lsof нічого не показує для порту, який використовується?

Процес може належати іншому користувачу або root. Виконайте ту саму команду з sudo на початку, щоб охопити всі процеси.

Чи безпечно завершити те, що працює на порту 5000 або 7000?

Не без перевірки назви. У нових версіях macOS ці порти часто використовує «Приймач AirPlay», який можна просто вимкнути в Системних параметрах.

Повʼязане

Покроково: Docker використовує забагато памʼяті.

Шукаєте щось краще за Монітор активності? Дивіться найкращі альтернативи Монітору активності для Mac або перегляньте усі терміни глосарію.