Я нахожусь в OS X 10.11.6 и пытаюсь запустить программу, которая обычно запускается на UDP-порту 8008
при запуске.Отпустите порт UDP, используемый мертвым процессом в OS X
Эта программа обычно также генерирует несколько вспомогательных дочерних процессов во время ее работы, но порт связан с родительским процессом.
К сожалению, при выходе из программы иногда порт остается открытым, хотя программа (родитель + дети) больше не существует.
Если это произойдет, если я попытаюсь запустить программу снова, она, естественно, терпит неудачу с ошибкой EADDRINUSE
, и в этих случаях, независимо от того, что я пытаюсь, единственным решением, которое я нашел, было перезагрузить компьютер.
Мне тяжело полагать, что я не могу освободить порт без перезагрузки.
Вот некоторые диагностики, я побежал до сих пор (я бежал все это и без sudo
):
Найдите процесс, используя порт 8008
с lsof
:
$ lsof -i -n -P | grep UDP | grep 8008
Но удивительно не верните любые результаты.
Однако, у меня было больше удачи с netstat
:
$ netstat -tulnvp udp | grep 8008
udp4 0 0 *.8008 *.* 196724 9216 47205 0
Таким образом, порт действительно связан, и виновный Pid 47205
, однако:
$ ps aux | grep 47205
не возвращает ничего. То же самое для PID 47206
и 47207
(точнее, PID, назначенные детям). Я также пробовал другие варианты grep
(название программы, путь и т. Д.).
Я также искал какого-либо процесса отчетности 47205
в качестве родителя:
$ ps -axo pid,ppid,command | grep 47205
Таким образом, дети процессы также явно мертвы.
Не будучи в состоянии kill
ничего, я пытался SIGHUP launchd
в надежде, что он может удалить любые зомби дочерние процессы:
$ sudo kill HUP 1
$ sudo kill -s HUP 1
Но увы, netstat
все еще показывает порт, связанный.
Наконец, я пытался перезапустить петлевой интерфейс:
$ sudo ifconfig lo down
$ sudo ifconfig lo up
Но опять же, никакого эффекта.
Я подождал несколько часов с момента последнего запуска программы, поэтому я уверен, что любой тайм-аут случится к настоящему времени, но порт просто не освободится.
Любые идеи о том, как принудительно освободить порт без перезагрузки?
Edit:
- Программа в вопросе электрон обернутый Patchwork.
- Этот вопрос исходит из этого вопроса github issue.
- Хотя найти решение/устранение ошибки, которая предотвращает проблемы с ocurring в первую очередь было бы идеально, я также заинтересован в пути вручную закрыть этот порт из терминала
Имейте это точно проблема с чем-то совершенно другим (а Go и C++ на основе Ethereum blockchain приложение под названием гетов и ETH). Иногда при выходе из приложения я остаюсь с UDP-портом 30303.Ничего, что я пробовал, освобождает порт, кроме перезагрузки. – wojo
У меня такая же проблема, которая произошла со мной несколько раз во время моего цикла Ctrl-C, make, run development. Однако это не всегда для меня. Я подозреваю, что это может произойти, только если я (rebuild и) снова запустил процесс снова после его убийства. Возможно, это улавливает ОС в плохом состоянии, когда она не завершила очистку сокетов от предыдущего запуска. – Josh
Вы должны знать, что порт закрыт только OS примерно через 2 минуты после того, как порт был закрыт процессом (процессами) ... это необходимо для предотвращения «старых» пакетов, по-прежнему перемещающих провод от нового порта , – Myst