Як закрити відкритий порт з терміналу на Mac?


199

Я відкрив порт №5955 з класу java для спілкування з клієнтом. Як закрити цей порт після того, як я закінчу? а також яка команда може показати мені, якщо порт відкритий чи закритий?


1
Як ви відкрили цей порт? Незрозуміло, чи говорите ви про відкриття та закриття портів у програмі java чи від брандмауера.
mariosangiorgio

Відповіді:


398
  1. Дізнайтеся ідентифікатор процесу (PID), який займає номер порту (наприклад, 5955), який ви хочете звільнити

    sudo lsof -i :5955
    
  2. Вбийте процес, який зараз використовує порт, використовуючи його PID

    sudo kill -9 PID
    

33
Надсилання -9 не повинно бути першою спробою вбити процес, і це дуже погана звичка. Наскільки я пам’ятаю, спочатку слід просто скористатися kill PID(що означає -15), а потім спробувати -2 і -1. -9 - остання можливість, лише якщо всі інші варіанти не спрацювали.
М'яв

3
вбив pID без жодних прапорів, як запропонував @Meow, і це спрацювало для мене
Тоні Лі

40

Щоб знайти процес, спробуйте:

sudo lsof -i :portNumber

Вбийте процес, який зараз використовує порт, використовуючи його PID

kill PID

а потім перевірте, чи закритий порт. Якщо ні, спробуйте:

kill -9 PID

Я би зробив наступне, якщо попередній не працював

sudo kill -9 PID

Просто, щоб бути в безпеці. Знову залежно від того, як ви відкрили порт, це може не мати значення.


26

Однак ви відкрили порт, ви закриєте його таким же чином. Наприклад, якщо ви створили сокет, прив'язали його до порту 0.0.0.0.1000955 і зателефонували послухати, закрийте цей самий сокет.

Ви також можете просто вбити процес, у якому відкритий порт.

Якщо ви хочете дізнатися, який процес має відкритий порт, спробуйте:

lsof -i :5955

Якщо ви хочете знати, чи відкритий порт, ви можете виконати ту саму команду lsof (якщо будь-який процес має відкритий, він відкритий; інакше це не так), або ви можете просто спробувати підключитися до нього, наприклад:

nc localhost 5955

Якщо він повертається негайно без виходу, порт не відкритий.

Можливо, варто згадати, що технічно кажучи, це не відкритий порт, а комбінація хост: порт. Наприклад, якщо ви підключені до локальної мережі як 10.0.1.2, ви можете прив’язати сокет до 127.0.0.1.1.19595 або 10.0.1.2.18955, не впливаючи жодного на іншого, або ви можете прив’язати до 0,0.0.0 : 5955, щоб впоратися з обома одразу. Ви можете побачити всі команди IPv4 та IPv6 вашого комп'ютера за допомогою ifconfigкоманди.


24

дуже простий порт пошуку 5900:

sudo lsof -i :5900

то розглядаючи 59553 як PID

sudo kill 59553

1
Це не додає нічого до існуючих відповідей!
ненависть

16

У 2018 році ось що працювало для мене за допомогою MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

тоді:

sudo kill -9 вашPID номер


1
lsof -nPiтрохи краще, оскільки номер порту насправді видно на виході, і ви отримуєте краще відчуття того, що ви вбиваєте.
Багатий камінь

1
Також корисно лише побачити інформацію про всі порти прослуховування:sudo lsof -nPi | grep LISTEN
leanne

15

Один лайнер найкраще

kill -9 $(lsof -i:PORT -t) 2> /dev/null

Приклад: На mac, хотіли очистити порт 9604. Наступна команда працювала як шарм

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 

6

Ви також можете скористатися цією першою командою, щоб вбити процес, який належить певному порту:

sudo netstat -ap | grep :<port_number>

Наприклад, скажімо, що цей процес містить порт 8000 TCP, після чого виконується команда:

sudo netstat -ap | grep :8000

буде виводити рядок, що відповідає порту, що тримає порт 8000 , наприклад:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

У цьому випадку procHoldingPort - це назва процесу, який відкрив порт, 4683 - його pid, а 8000 (зауважте, що це TCP) - номер порту, який він містить (який ви хочете закрити).

Потім вбити процес, дотримуючись наведеного вище прикладу:

kill  4683

Як згадували інші, якщо це не працює (ви можете спробувати використовувати kill з -9 як аргумент):

kill -9 4683

Знову ж таки, загалом, краще уникати надсилання SIGKILL (-9), якщо можете.

Ура,

Хлопець.


5

Я використовую в lsofпоєднанні з kill, як було сказано вище; але написав невеликий швидкий скрипт для автоматизації цього процесу.

За допомогою цього сценарію ви можете просто ввести killport 3000з будь-якого місця, і це знищить усі процеси, що працюють на порту 3000.

https://github.com/xtrasimplicity/killport


1
Ти врятував мені день. Чомусь lsofу поєднанні з killне повернув нічого і змусив мій сценарій повісити на macOS Sierra. Але killportпрацює як шарм і швидше. Дякую!
wout

4

Я створив для цього функцію.

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

Копіювання та вставлення цього блоку коду у ваш термінал повинно звільнити потрібний порт. Просто не забудьте змінити номер порту в останньому рядку.


3

спробуйте нижче, якщо припустимо, що запущений порт 8000:

free-port() { kill "$(lsof -t -i :8000)"; }

Я знайшов посилання тут


1

Коли програма, яка відкрила порт, закривається, порт закриється автоматично. Якщо ви вбиваєте процес Java на цьому сервері, це слід зробити.


-1
  1. Спочатку з’ясуйте id Procees (pid), який займав необхідний порт (наприклад, 5434)

    ps aux | grep 5434

2.убити цей процес

   kill -9 <pid>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.