Я открыл порт № 5955 из класса Java для общения с клиентом. Как закрыть этот порт после завершения? а также какая команда может показать мне, если порт открыт или закрыт?
Я открыл порт № 5955 из класса Java для общения с клиентом. Как закрыть этот порт после завершения? а также какая команда может показать мне, если порт открыт или закрыт?
Ответы:
Узнайте идентификатор процесса (PID), который занимает номер порта (например, 5955), который вы хотели бы освободить
sudo lsof -i :5955
Убейте процесс, который в данный момент использует порт, используя его PID
sudo kill -9 PID
kill PID
(что подразумевает -15), затем попробуйте -2 и -1. -9 - последнее средство, только если все остальные параметры не сработали.
Чтобы найти процесс, попробуйте:
sudo lsof -i :portNumber
Убейте процесс, который в данный момент использует порт, используя его PID
kill PID
а затем проверьте, закрыт ли порт. Если нет, попробуйте:
kill -9 PID
Я сделал бы только следующее, если предыдущий не работал
sudo kill -9 PID
Просто чтобы быть в безопасности. Опять же, в зависимости от того, как вы открыли порт, это может не иметь значения.
Однако, открыв порт, вы закрываете его таким же образом. Например, если вы создали сокет, привязали его к порту 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
.
В 2018 году вот что сработало для меня с использованием MacOS HighSierra:
sudo lsof -nPi: ваш номер порта
затем:
sudo kill -9 yourPIDnumber
lsof -nPi
немного лучше, потому что номер порта на самом деле виден на выходе, и вы лучше понимаете, что вы убиваете.
sudo lsof -nPi | grep LISTEN
Один лайнер лучше
kill -9 $(lsof -i:PORT -t) 2> /dev/null
Пример: на Mac хотел очистить порт 9604. Следующая команда работала как чудо
kill -9 $(lsof -i:9604 -t) 2> /dev/null
Вы также можете использовать эту первую команду, чтобы убить процесс, которому принадлежит определенный порт:
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.
Я использую в lsof
сочетании с kill
, как уже упоминалось выше; но написал быстрый маленький скрипт bash для автоматизации этого процесса.
С помощью этого скрипта вы можете просто печатать killport 3000
из любого места, и он уничтожит все процессы, запущенные на порте 3000
.
lsof
в сочетании с kill
не вернул ничего и заставил мой скрипт зависать на macOS Sierra. Но killport
работает как шарм и быстрее. Спасибо!
Я создал функцию для этой цели.
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
Скопируйте и вставьте этот блок кода в свой терминал, чтобы освободить нужный порт. Просто не забудьте изменить номер порта в последней строке.
попробуйте ниже, предполагая, что запущенный порт 8000
:
free-port() { kill "$(lsof -t -i :8000)"; }
Я нашел ссылку здесь
Сначала выясните идентификатор Procees (pid), который занял требуемый порт (например, 5434).
PS Aux | grep 5434
2. убить этот процесс
kill -9 <pid>