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

199

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

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

Ответы:

398
  1. Узнайте идентификатор процесса (PID), который занимает номер порта (например, 5955), который вы хотели бы освободить

    sudo lsof -i :5955
    
  2. Убейте процесс, который в данный момент использует порт, используя его PID

    sudo kill -9 PID
    
Future2020
источник
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.

abarnert
источник
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

XtraSimplicity
источник
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, на котором работает этот сервер, он должен это сделать.

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

    PS Aux | grep 5434

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

   kill -9 <pid>
Ашутош Гупта
источник