Я відкрив порт №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.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
команди.
У 2018 році ось що працювало для мене за допомогою MacOS HighSierra:
sudo lsof -nPi: yourPortNumber
тоді:
sudo kill -9 вашPID номер
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), якщо можете.
Ура,
Хлопець.
Я використовую в lsof
поєднанні з kill
, як було сказано вище; але написав невеликий швидкий скрипт для автоматизації цього процесу.
За допомогою цього сценарію ви можете просто ввести 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)"; }
Я знайшов посилання тут
Спочатку з’ясуйте id Procees (pid), який займав необхідний порт (наприклад, 5434)
ps aux | grep 5434
2.убити цей процес
kill -9 <pid>