Как закрыть открытый порт из терминала на Mac?


199

Я открыл порт № 5955 из класса Java для общения с клиентом. Как закрыть этот порт после завершения? а также какая команда может показать мне, если порт открыт или закрыт?


1
Как вы открыли этот порт? Не ясно, говорите ли вы об открытии и закрытии портов в Java-приложении или из брандмауэра.
Мариосангиорджо

Ответы:


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, и это сработало для меня
Тони Ли

41

Чтобы найти процесс, попробуйте:

sudo lsof -i :portNumber

Убейте процесс, который в данный момент использует порт, используя его PID

kill PID

а затем проверьте, закрыт ли порт. Если нет, попробуйте:

kill -9 PID

Я сделал бы только следующее, если предыдущий не работал

sudo kill -9 PID

Просто чтобы быть в безопасности. Опять же, в зависимости от того, как вы открыли порт, это может не иметь значения.


26

Однако, открыв порт, вы закрываете его таким же образом. Например, если вы создали сокет, привязали его к порту 0.0.0.0:5955 и вызвали listen, закройте тот же сокет.

Вы также можете просто убить процесс, у которого открыт порт.

Если вы хотите узнать, какой процесс имеет открытый порт, попробуйте это:

lsof -i :5955

Если вы хотите узнать, открыт ли порт, вы можете выполнить ту же команду lsof (если у какого-либо процесса он открыт, он открыт; в противном случае это не так), или вы можете просто попытаться подключиться к нему, например:

nc localhost 5955

Если он возвращается немедленно без вывода, порт не открыт.

Возможно, стоит упомянуть, что, технически говоря, это не открытый порт, а комбинация хост: порт. Например, если вы подключены к локальной сети как 10.0.1.2, вы можете привязать сокет к 127.0.0.1:5955 или 10.0.1.2:5955, без влияния одного из них на другой, или вы можете привязать к 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: ваш номер порта

затем:

sudo kill -9 yourPIDnumber


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), если можете.

Ура,

Guy.


5

Я использую в lsofсочетании с kill, как уже упоминалось выше; но написал быстрый маленький скрипт bash для автоматизации этого процесса.

С помощью этого скрипта вы можете просто печатать 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

Скопируйте и вставьте этот блок кода в свой терминал, чтобы освободить нужный порт. Просто не забудьте изменить номер порта в последней строке.



1

При выходе из программы, открывшей порт, порт будет автоматически закрыт. Если вы убьете процесс Java, на котором работает этот сервер, он должен это сделать.


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

    PS Aux | grep 5434

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

   kill -9 <pid>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.