вы задаете здесь неправильный вопрос. На самом деле невозможно просто "закрыть порт" извне приложения, которое открыло сокет, слушая его. Единственный способ сделать это-полностью уничтожить процесс, которому принадлежит порт. Затем, примерно через минуту или две, порт снова станет доступен для использования. Вот что происходит (если вам все равно, перейдите к концу, где я покажу вам, как убить процесс, владеющий определенным портом):
порты-ресурсов выделяется ОС для различных процессов. Это похоже на запрос указателя файла в ОС. Однако, в отличие от указателей файлов, порт может принадлежать только одному процессу. Через интерфейс сокета 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.
как я уже сказал, для повторного открытия порта потребуется несколько минут, если вы это сделаете. Я не знаю, как это ускорить. Если это сделает кто - то другой, я с удовольствием послушаю.