Порт, що прослуховується
Також: відкриті порти, що використовує порт 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, і це не каже, який проєкт запущено. На це відповідають дві команди.
- Отримайте PID командою
lsof -nP -iTCP:3000 -sTCP:LISTEN. - Виконайте
ps -o pid,ppid,command -p <PID>, щоб побачити повну команду, яка його запустила. - Виконайте
lsof -a -p <PID> -d cwd, щоб побачити папку, у якій він працює, — зазвичай це папка проєкту. - Якщо 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 або перегляньте усі терміни глосарію.