Как закрыть открытый порт из терминала на Mac?
Я открыл порт № 5955 из класса Java для общения с клиентом. Как закрыть этот порт после завершения? а также какая команда может показать мне, если порт открыт или закрыт?
Узнайте идентификатор процесса (PID), который занимает номер порта (например, 5955), который вы хотели бы освободить
Убейте процесс, который в данный момент использует порт, используя его PID
Чтобы найти процесс, попробуйте:
Убейте процесс, который в данный момент использует порт, используя его PID
а затем проверьте, закрыт ли порт. Если нет, попробуйте:
Я сделал бы только следующее, если предыдущий не работал
Просто чтобы быть в безопасности. Опять же, в зависимости от того, как вы открыли порт, это может не иметь значения.
Однако, открыв порт, вы закрываете его таким же образом. Например, если вы создали сокет, привязали его к порту 0.0.0.0:5955 и вызвали listen, закройте тот же сокет.
Вы также можете просто убить процесс, у которого открыт порт.
Если вы хотите узнать, какой процесс имеет открытый порт, попробуйте это:
Если вы хотите узнать, открыт ли порт, вы можете выполнить ту же команду lsof (если у какого-либо процесса он открыт, он открыт; в противном случае это не так), или вы можете просто попытаться подключиться к нему, например:
Если он возвращается немедленно без вывода, порт не открыт.
Возможно, стоит упомянуть, что, технически говоря, это не открытый порт, а комбинация хост: порт. Например, если вы подключены к локальной сети как 10.0.1.2, вы можете привязать сокет к 127.0.0.1:5955 или 10.0.1.2:5955, без влияния одного из них на другой, или вы можете привязать к 0.0.0.0 : 5955 для обработки обоих одновременно. С помощью команды вы можете увидеть все адреса IPv4 и IPv6 вашего компьютера ifconfig .
Источник
Как я могу открыть порт 8080 Mac OS X Lion?
Как я могу открыть доступ к порту 8080 из внешнего мира (частной сети) на моем Mac OS X Lion? Я хотел бы получить доступ к веб-странице, которая работает на моем стеке ламп на моем Mac (Zend Server CE) из локальной сети. Я могу получить доступ к порту 80 просто отлично. Порт 8080 заблокирован с другой стороны. Я также отключил брандмауэр.
Когда вы говорите, что отключили брандмауэр, вы имеете в виду тот, который указан в:, System Preferences > Security > Firewall или ipfw IP-брандмауэр, к которому вы можете получить доступ из командной строки? Или, возможно, оба?
Чтобы проверить, есть ли у вас ipfw правила, вы всегда можете зайти в терминал и ввести:
Вы также можете использовать, nmap чтобы проверить, открыт ли порт из разных мест вашей внутренней сети. Конечно, OS X не поставляется с nmap по умолчанию, поэтому вам придется попробовать это на компьютере с Linux или использовать что-то вроде Fink или Macports для его установки.
nmap -p 8080 host.domain.com
Надеюсь, это поможет.
Вы можете отключить брандмауэр или разрешить определенному приложению принимать входящие соединения. Кроме того, чтобы разрешить доступ к внешнему миру (например, www), вам необходимо перенаправить трафик на ваш внутренний шлюз: порт через настройки маршрутизатора.
Вот как это сделать:
- Mac-> Sys Preferences-> Sharing-> Включить флажок «Общий веб-доступ»
- Mac-> Настройки Sys-> Безопасность-> Отключить брандмауэр или разрешить приложению принимать входящее соединение
Откройте порт на маршрутизаторе (через 192.168.1.1) для пересылки трафика с your_web_ip: порт на local_gateway: порт
- Настройки маршрутизатора -> Переадресация портов -> Создать правило: переслать на локальный шлюз (например, 192.168.1.4), пользовательский порт, протокол tcp, source = any, destination = 3280, все типы соединений, forward to port = 8080.
Источник
Освободить порт UDP, используемый мертвым процессом в OS X
Я использую OS X 10.11.6 и пытаюсь запустить программу, которая обычно прослушивает порт UDP 8008 при запуске.
Эта программа обычно также порождает несколько вспомогательных дочерних процессов во время своей работы, но порт привязан к родительскому процессу.
К сожалению, при выходе из программы иногда порт остается открытым, даже если программа (родительская + дочерняя) больше не существует.
Когда это происходит, если я снова пытаюсь запустить программу, она, естественно, выдает ошибку с ошибкой EADDRINUSE , и в этих случаях, что бы я ни пытался, единственным решением, которое я нашел, была перезагрузка машины.
Мне трудно поверить, что я не могу освободить порт без перезагрузки.
Вот некоторые диагностические данные, которые я проводил до сих пор (все они были выполнены с sudo и без него):
Найдите процесс, используя порт 8008 с lsof :
Но на удивление не дает никаких результатов.
Однако с netstat мне повезло больше:
Итак, порт действительно привязан, и виноват pid 47205 , однако:
Ничего не возвращает. То же самое для PID 47206 и 47207 (безусловно, PID, назначенные дочерним элементам). Я также пробовал другие варианты grep (имя программы, путь и т. Д.).
Я также искал любой процесс, сообщающий 47205 как родительский:
Таким образом, дочерние процессы также явно мертвы.
Не имея возможности ничего сделать kill , я попытался SIGHUP launchd в надежде, что это может удалить любые дочерние процессы-зомби:
Но, увы, netstat по-прежнему показывает привязку к порту.
Наконец, я попытался перезапустить интерфейс обратной петли:
Но опять же безрезультатно.
Я ждал несколько часов с момента последнего запуска программы, поэтому я почти уверен, что к этому моменту истекло время ожидания, но порт просто не будет выпущен.
Есть идеи, как принудительно освободить порт без перезагрузки?
- Рассматриваемая программа — это Patchwork с электронной оболочкой.
- Этот вопрос возник из этой проблемы с github.
- Хотя было бы идеально найти решение / исправление, которое предотвращает возникновение проблемы, меня также интересуют способы вручную закрыть этот порт с терминала.
5 ответов
Действительно, можно закрыть порт вручную без перезапуска машины. В различных версиях Linux это обычно делается с помощью GDB путем выдачи системных вызовов, маскирующихся под процесс (например, close(fd) системный вызов для файлового дескриптора сокета).
Процесс для этого:
- Откройте порт UDP: netcat -u 127.0.0.1 33333 .
- Проверьте порт UDP: netstat -npu (u for UDP) , который даст вам PID, который занимает этот порт.
- Выполните: lsof -np $pid для этого ПЛАТНОГО, чтобы получить дескриптор файла для сокета.
- Затем запустите GDB для этого PID: sudo gdb -p 73599
- Находясь внутри GDB, запустите call close(file_descriptor)
Вы увидите, что порта больше нет:
GDB доступен для MacOS, так что он должен работать и в вашем случае.
Один связанный вопрос: Mac изменил поведение SO_REUSEADDR и SO_REUSEPORT:
И я поддерживаю iptux [1], если я использую SO_REUSEPORT, программа может запуститься, но я не могу получить сообщение с этого порта, все сообщения отправляются на незакрытый порт как черная дыра.
В вашем коде после создания сокета, но перед вызовом bind , вызовите следующее:
Затем позвоните bind . Вышеуказанное позволит успешно выполнить привязку сокета, даже если порт используется.
Два процесса, пытающиеся использовать recvfrom на одном и том же порте, приведут к тому, что один из процессов получит пакет, но не другой. И не детерминировано, какой именно. Поэтому убедитесь, что на самом деле у вас нет двух процессов, которые работают законно и совместно используют порт.
Ваш вопрос похож на:
Наконец, я попытался перезапустить интерфейс обратной петли:
$ sudo ifconfig lo вниз
$ sudo ifconfig lo вверх
Вы пробовали перезапустить все доступные сетевые интерфейсы (lan или wlan), а не только loopback)?
Вместо ifconfig вы можете также использовать собственную командную утилиту MacOS (из здесь), чтобы выключить, а затем включить само устройство (адаптировать en0 к your device name ):
Вы также можете, наконец, попробовать освободить и обновить DHCP с помощью:
Система может держать сокет открытым до тех пор, пока не будет выполняться процесс ввода-вывода. Даже когда процесс умер, но не закрыл сокет явно. Если ваша розетка не закрывается в часы, скорее всего, вам что-то не хватает. Попробуйте использовать низкоуровневое исследование ядра вместо утилит верхнего уровня, таких как netstat или lsof.
Я не эксперт по OS X и большинство команд для Linux. Я все равно оставляю его там, если у кого-то будет такая же проблема.
1. Попробуйте проверить, активен ли сокет (необязательно)
Я могу предложить проверить связь сокета.
Если вы видите какие-либо данные, передаваемые через сокет, вы можете быть уверены, что процесс активен. Или может быть одним из его детей. Позже вы можете поймать pid с помощью strace
2. Проверьте процесс и его статус
В Linux есть замечательные procfs . Вы можете получить оттуда так много всего. И убедитесь, что вы видите все открытые дескрипторы файлов.
Если вы видите вывод и существует / proc / 47205 , pid не выпущен, но ps показывает. Вы увидите все открытые файлы и их fds.
Где 133 — это номер fd
К сожалению, в OS X нет файловой системы / proc. Альтернативную команду я нашел.
Но я не уверен, что он работает на 100%.
3. Закрытие файлового дескриптора (сокета) в другом процессе
В linux есть хорошая команда
Это явно закроет все процессы, блокирующие порт. Кажется, в OS X тоже может быть fuser
Другой реальный способ хакеров — подключиться к процессу с помощью gdb и запускать команды внутри процесса, потому что номера файловых дескрипторов действительны только в среде процесса, в точности как написал @Mindaugas Бернатавичюс:
Есть третий способ : если возможно, вы можете просто перезапустить всю сеть. Пожалуйста, обратите внимание, что только интерфейс обратной петли вверх и вниз не достаточно. В Linux запустить
4. Что делать, чтобы сокет не завис в системе
Вы всегда должны гарантировать закрытие socked перед выходом из программы. Я видел много проблем с nodejs, когда сокеты остаются открытыми . Вызов Socket.destroy () решит проблему
Здесь можно разместить код уничтожения сокета перед выходом из приложения:
// Пользователь закрыл приложение. Убейте хост-процесс.
Источник
Ошибка сервера Tomcat-порт 8080 уже используется
Я получил следующую ошибку при попытке выполнить программу сервлета в Eclipse Mars EE.
‘запуск Tomcat v8.0 Sever на localhost ‘ столкнулся с проблемой.
порт 8080 требуется Tomcat v8.0 сервер на localhost уже находится в использовать. Возможно, уже запущен другой процесс или система процесс может использовать порт. Для запуска этого сервера вам необходимо остановите другой процесс или измените порт номер(а).
Что я должен сделать, чтобы остановить процесс? Я предполагаю, что сервер Tomcat 7 должен быть остановлен. Как это сделать, если моя операционная система Windows 8?
16 ответов
Если вы хотите восстановить номер порта 8080, вы делаете это, открыв Диспетчер задач, а затем вкладку процесс, щелкните правой кнопкой мыши java.exe процесс и нажмите на конец процесса, как показано на рисунке прилагается.
все, что мне нужно было изменить port numbers .
на Servers panel
щелкните правой кнопкой мыши на сервере Tomcat выберите Open , Overview window появится.
открыть Ports tab. Вы получите следующий:
я изменил номер порта HTTP/1.1 (т. е. 8081 )
возможно, Вам также придется изменить порт Tomcat adminport (т. е. 8006 ) и AJP/1.3 (т. е. 8010 ).
доступ приложения в браузере в http://localhost:8081/.
Для Ubuntu / Linux
Шаг 1: Найдите идентификатор процесса, который использует порт 8080
Шаг 2: убейте процесс, используя идентификатор процесса в приведенном выше результате
Для Windows
Шаг 1: Найдите идентификатор процесса
Шаг 2: Откройте командную строку как администратор и убейте процесс
в моем случае порт 8005 уже использовался, поэтому я использовал то же самое выше лестница.
выполните приведенную выше команду в командной строке первая команда найдет pid процессов, которые используют порт 8080 или любой другой порт, который вы используете. И во второй команде напишите pid вместо 21424.
У вас уже запущен другой экземпляр Tomcat. Вы можете подтвердить это, перейдя в http://localhost:8080 в вашем веб-браузере и проверьте, получаете ли вы домашнюю страницу Tomcat по умолчанию или страницу ошибок Tomcat 404. Оба являются одинаково действительными доказательствами того, что Tomcat работает нормально; если бы это было не так, то вы получили бы сообщение об ошибке тайм-аута HTTP-соединения браузера.
вам нужно выключить его. Перейдите в подпапку /bin папки установки Tomcat и выполнить отключение.bat (Windows) или shutdown.sh (Unix) сценарий.
для получения дополнительной помощи, пожалуйста, chech это ответ.
из CMD или из PowerShell запустите.
команды netstat -АБ
выход должен быть в состоянии указать вам в направлении, в котором процесс удерживает порт 8080. Запись может быть 127.0.0.1: 8080 у вас все еще может быть запущенный экземпляр Tomcat в порту 8080.
затем вы можете использовать Stop-Process в PowerShell или» taskkill » в CMD, чтобы остановить этот процесс и выполнить программу в этот момент.
чтобы избавиться от этой ошибки, просто нажмите на вкладку сервера на eclipse . Вы получите список серверов, как показано ниже (в моем случае это был tomcat 8 only)
дважды щелкните на соответствующем сервере. Вы получаете экран, как показано ниже:
теперь измените конфликтующий номер порта. В моем случае я изменил 8080 на 8081 (выделенная часть). Сохраните его (ctrl+s) и, следовательно, вы можете запустить свой сервер сейчас.
Я бы предложил в конце java.exe или javaw.exe процесс из Диспетчера задач и повторите попытку. Это не завершит все приложение eclipse, но освободит порт.
вы можете решить эту проблему в два этапа:
Шаг 1: Откройте командную строку и введите netstat-a-o-f и нажмите enter (эта команда покажет все процессы, запущенные на вашем компьютере) https://i.stack.imgur.com/m66JN.png
Шаг 2: Введите TASKILL /F / PID 4036 (где F означает силу, а PID — Родительский идентификатор, а 4036 — идентификатор процесса 8080, здесь я использую некоторые случайные число) https://i.stack.imgur.com/Co5Tg.png
несколько раз, когда вы пытаетесь убить процесс, он выдаст исключение, сообщающее, что доступ запрещен, как показано на приведенном выше скриншоте, в этот момент Вы должны открыть командную строку как запуск от имени администратора https://i.stack.imgur.com/JwZTv.png
затем вернитесь к eclipse очистить проект, а затем попробуйте запустить проект
в случае пользователей MAC перейдите в терминал и выполните следующие действия
8080-это порт HTTP, а 8443-порт HTTPS по умолчанию.
вы можете прекратить использование выключения.bat внутри каталога установки tomcat. Или вы можете нажать кнопку «стоп» в представлении серверов eclipse. Чтобы добраться до вида выберите окно-показать вид-серверы
для пользователей Ubuntu с той же проблемой (например, сбой Eclipse во время отладки) сделайте netstat-a-p | grep 8095 (или любой другой номер порта, если сервер Tomcat), а затем убейте -9 этот процесс.
Откройте приложение ниже
C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Меню\Программы\Apache Tomcat 8.5 Tomcat8
щелкните правой кнопкой мыши на Apache tomcat в системном трее и нажмите на stop services
запустите приложение из eclipse.
вы можете остановить работающий сервер tomcat, выполнив следующие действия:
Шаг 1: Перейдите к пути установки tomcat (/bin) в вашей системе Windows
Шаг 2: Откройте cmd для этого каталога bin (вы можете легко сделать это, введя » cmd «в этом каталоге)
Шаг 3: Запустите «Tomcat7.exe stop»
Это остановит все запущенные экземпляры сервера tomcat, и теперь вы можете запустить сервер из своей среды Eclipse IDE.
способ, которым я решил эту проблему, установить TCPview перейти к TCP view и проверить, какие порты Tomcat использует там будет несколько других портов, кроме 8005,8009,8080 Теперь перейдите на вкладку серверы в eclipse дважды щелкните на Tomcatv9.0 сервер и изменить номера портов там. Это решит проблему.
дело в том , что у вас уже есть другой tomcat, работающий на порту 8080, вам нужно закрыть его. Вы можете сделать это несколькими способами. позвольте мне сказать вам 2 простых способов
- либо перейдите в место, где установлен tomcat, перейдите в каталог din и выполните завершение работы.летучая мышь или shutdown.sh
- Если вы находитесь в windows, перейдите в правую нижнюю панель уведомлений экрана, нажмите на стрелку вверх, чтобы увидеть больше запущенных служб, вы найдет здесь кота. щелкните правой кнопкой мыши и выберите shutdown. вот оно.
Источник