Возможно, это - проявление той же проблемы, описанной здесь:
Обходное решение для выполнения сервера VNC в Windows Vista
Проблемы вызываются Windows Vista новое средство защиты под названием Сессия 0 Изоляции. Предыдущие версии Windows выполнили системные службы на той же сессии входа в систему как локально зарегистрированный пользователь (Сессия 0). В Windows Vista Сессия 0 теперь резервируется для этих сервисов, и все интерактивные логины сделаны на других сессиях, вызвав сервер VNC, не могущий принять входящий дистанционный запрос на установление соединения.
и предлагаемое решение:
Таким образом, для создания сервера VNC на работах Windows Vista правильно, разрешение обходного решения (по крайней мере, пока разработчики VNC для выпуска надлежащей фиксации или обновления для обращения к новому ограничению безопасности в Windows Vista) состоит в том, чтобы выполнить сервер VNC в непривилегированном режиме.
Или попробуйте, если это работает с UltraVNC.
P.S.: Вот статья MSDN о Совместимости приложения: Сессия 0 Изоляции.
Так как Вы только делаете это вручную, Вам, вероятно, придется добавить другую проверку.
netstat -p
и уничтожьте pid, связанный с Вашим открытым сокетом, даже если это - удар или sh.
Кроме того, Вы упомянули это большую часть времени работы SIGTERM. Если это так, Ваше приложение должно поймать SIGTERM и вскочить в некоторый корректный код выхода что RSTs все открытые соединения и затем закрывает сокет.
HTH
Сервер все еще ожидает некоторые пакеты от клиентов после того, как сокеты слушания будут закрыты, и сохраняет порт присвоенным. Приложение может использовать опцию сокета SO_REUSEADDR позволить непосредственное повторное использование адреса сокета.
Вот выборка от моего IP Linux (7) страница руководства:
Локальный адрес сокета TCP, который был связан, недоступен в течение некоторого времени после закрытия, если флаг SO_REUSEADDR не был установлен. Необходимо соблюдать осторожность при использовании этого флага, поскольку это делает TCP менее надежным.
Сервер приложений или сервер приложений могли бы иметь параметр конфигурации для использования этой опции сокета.
netstat
вывод почти наверняка показал бы, что сокет находится в TIME_WAIT, который только имел бы значение, был ли все еще шанс, что что-то полезное могло прибыть в сокет. Так как приложение, которое обработало бы ту информацию, уже мертво, она doesn' t имеют значение если it' s снова использованный.
– Insyte
18 March 2010 в 17:44
Ваш не на самом деле уничтожение Вашего JAVA-приложения, Вашего на самом деле уничтожения Вашей виртуальной машины Java (jvm) экземпляр, который в свою очередь запускает Ваше JAVA-приложение.
Это не идея способ завершить Ваш процесс Java.
если то, что вы имели необходимость уничтожить Ваш jvm с уничтожением-9, jvm привычка может, разрешают после себя таким образом оставляющий операционные ресурсы в неопределенности.:-(
Добавьте некоторую функциональность к своему приложению, чтобы заставить его выйти корректно. Если у Вас нет выбора, то попытайтесь уничтожить Вас jvm с-15, он может помочь ему разрешить после себя.
Если Ваша программа Java действительно подвешивает jvm, то необходимо получить отладчик и раздавить тех вредителей.
Уничтожение процесса и перезапуск его являются взломом, but's не фиксируют. Необходимо только использовать SIGKILL, если процесс не отвечает никакой другой метод.
Я обычно пробую
уничтожьте-15
затем только уничтожьте-9 как последнее прибежище.
и для забавы...
С Вашим обновлением у меня есть другое объяснение. Процесс sh, сохраняющий открытый сокет, должен быть ребенком Вашего приложения, разветвленного после того, как сокет слушания был открыт. Это не умерло со своим родителем и было принято процессом init.
Необходимо попытаться узнать то, что то, что оболочка обрабатывает для (вероятно, некоторый сценарий, запущенный приложением) и почему это не завершается. Возможно, будет достаточно исправить сценарий, таким образом, это завершится после окончания его, задание будет достаточно? Или существует способ заставить его не отсоединиться от родителя (это должно умереть с родителем, если часть той же группы процесса), или доберитесь близко до всех ненужных дескрипторов файлов, наследованных от родителя.
Можно попробовать:
fuser -p $pid_of_the_sh_process
видеть то, что другие файлы это сохраняет открытым. Один из них будет, по всей вероятности, сценарием оболочки. Знание, что это, мы можем найти способ решить проблему.
Если у Вас есть доступ к исходному коду, необходимо создать сокет с SO_REUSEADDR
опция упоминается Jacek. Также интереса tcp_tw_recycle
и tcp_tw_reuse
флаги ядра (на Linux).
Настоящая проблема находится в дизайне протокола, который Вы можете или не мочь изменять. Интересные потоки по теме: