Вы вроде задаете неправильный вопрос здесь. На самом деле просто невозможно "закрыть порт" извне приложения, открывшего сокет, прослушивающий его. Единственный способ сделать это - полностью убить процесс, которому принадлежит порт. Затем, через минуту или две, порт снова станет доступным для использования. Вот что происходит (если вам все равно, перейдите к концу, где я покажу вам, как убить процесс, владеющий конкретным портом):
Порты - это ресурсы, выделяемые ОС различным процессам. Это похоже на запрос ОС к указателю файла. Однако, в отличие от файловых указателей, порт может иметь только ОДИН процесс за раз. Через интерфейс сокета BSD процессы могут сделать запрос на прослушивание порта, который ОС затем предоставит. ОС также будет следить за тем, чтобы другие процессы не получали такой же порт. В любой момент процесс может освободить порт, закрыв сокет. Затем ОС восстановит порт. В качестве альтернативы, если процесс завершится без освобождения порта, ОС в конечном итоге восстановит порт (хотя это произойдет не сразу: это займет несколько минут).
Теперь то, что вы хотите сделать (просто закрыть порт из командной строки), невозможно по двум причинам. Во-первых, если бы это было возможно, это означало бы, что один процесс мог просто украсть ресурс другого процесса (порт). Это было бы плохой политикой, если не ограничено привилегированными процессами. Вторая причина - неясно, что произойдет с процессом, которому принадлежит порт, если мы позволим ему продолжить работу. Код процесса написан в предположении, что он владеет этим ресурсом. Если бы мы просто забрали его, он сам бы закончился сбоем, поэтому ОС не позволяет вам этого делать, даже если вы являетесь привилегированным процессом. Вместо этого вы должны просто убить их.
В любом случае, вот как убить процесс, которому принадлежит определенный порт:
sudo netstat -ap | grep :<port_number>
Это выведет строку, соответствующую порту удержания процесса, например:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
В этом случае procHoldingPort - это имя процесса, который открыл порт, 4683 - это его pid, а 8000 (обратите внимание, что это TCP) - это номер порта, который он содержит.
Затем посмотрите в последнем столбце, вы увидите /. Затем выполните это:
kill <pid>
Если это не сработает (вы можете проверить, повторно выполнив команду netstat). Сделай это:
kill -9 <pid>
В общем, лучше избегать отправки SIGKILL, если можете. Вот почему я говорю вам, чтобы попытаться kill
прежде чем kill -9
. Просто использование kill
отправляет более мягкую SIGTERM.
Как я уже сказал, для повторного открытия порта потребуется еще несколько минут, если вы сделаете это. Я не знаю способ ускорить это. Если кто-то другой, я бы хотел это услышать.