Tomcat не смог завершить работу
Когда я добавляю следующие параметры Java для включения отладки:
JAVA_OPTS="$JAVA_OPTS -noverify -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"
При попытке отключить tomcat я получаю следующую ошибку:
ERROR: transport error 202: bind failed: Address already in use ["transport.c",L41]
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_INIT(510) ["debugInit.c",L500]
JDWP exit error JVMTI_ERROR_INTERNAL(113): No transports initializedFATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ERROR_INTERNAL(113)
Ответы
Ответ 1
Спасибо за хорошее короткое объяснение, Фета! Следуя вашим советам, я нашел, что лучший способ решить проблему - просто использовать CATALINA_OPTS вместо JAVA_OPTS.
В Catalina.sh можно увидеть, что CATALINA_OPTS используется только командами "start" и "start-security", тогда как JAVA_OPTS также используется командой "stop" (по крайней мере, с Tomcat 6.0.33 на openSUSE 12.1).
По крайней мере, если у вас установлен Tomcat в Linux с помощью диспетчера пакетов, то изменение переменной CATALINA_OPTS в файле /etc/tomcat 6/tomcat6.conf(или любой другой путь в вашем дистрибутиве) будет более чистым, чем изменение каталога catalina.sh script напрямую, поскольку менеджер пакетов предполагает, что пользователь изменяет только файлы конфигурации, и нарушение этого предположения может вызвать проблемы при обновлении пакетов Tomcat (например, потерянные настройки, поскольку файл catalina.sh перезаписан).
Я думаю, что лучше использовать CATALINA_OPTS над JAVA_OPTS не только для JDWP, но и для многих других опций: e. г. если использовать параметр размера кучи -Xmx... тогда было бы разумно поместить его в CATALINA_OPTS, так как команде "stop" не нужно много кучи.
Ответ 2
Вы пытаетесь отладить tomcat при запуске, поэтому он связывается с портом 5005 при запуске jvm.
При запуске catalina.sh stop
запускается еще один jvm, который также пытается привязать к порту 5005.
Вам нужно переместить аргументы debug в run и начать аргументы (в catalina.sh
) tomcat, поэтому их прямо в JAVA_OPTS
является причиной проблемы, с которой вы сталкиваетесь.
Ответ 3
Проблема заключается в том, что ваш tomcat все еще работает на порту отладки (5005) или какой-либо другой службе, запущенной на том же порту (5005).
Если tomcat все еще работает, вы можете его убить
- если он находится в среде linux ps -ef | grep java и идентифицирует идентификатор процесса. и убить процесс, используя sudo kill -9.
- Если он в среде Windows попадает в диспетчер задач и убивает процесс tomcat и java.
Теперь вы можете запустить сервер в отладочном настроении без каких-либо проблем.
Это может произойти при отладке unit test с помощью инструмента (eclipse), который был выполнен через maven. Для этого вы можете протекать по тому же самому процессу.
Сначала закройте Eclipse и убейте java-процесс и запустите его снова.
Ответ 4
Кажется, что порт 5005 уже используется. Проверьте открытые порты командой netstat.
Возможно, это связано с тем, что вы уже открыли tomcat. Проверьте свои процессы.
Ответ 5
Это связано с тем, что оба приложения прослушивают один и тот же номер порта i.e 8000 во время работы в режиме отладки.
Одним быстрым решением является изменение порта отладки на 8001 в startup.bat
SET DEBUGPORT=8001
Ответ 6
Кажется, вы запускаете Tomcat с включенным Debugger. Это заставляет JVM подключаться к процессу отладки, однако в файле catalina.sh есть сценарий case для запуска, остановки, перезапуска и т.д. и т.д. Выдача команды останова по-прежнему добавляет это, поскольку она является частью вашего глобального JAVA_OPTS и пытается запустить отладчик, прослушивающий тот же порт для команды shutdown. Если вы удалите адрес = 50005 из JAVA_OPTS или используйте команды запуска jdpa для запуска виртуальной машины с помощью отладчика, это устранит вашу проблему.
Посмотрите на Catalina.sh по умолчанию в последнем дистрибутиве Tomcat, если вам нужна чистая копия. Похоже, что кто-то внесла изменения внутри вашего, которые являются недействительными и заставляют JDPA запускаться при запуске, остановке, любой выданной команде.
Ответ 7
установить JPDA_ADDRESS = 8001 в Catalina.bat, то есть порт отладки
и изменить все 3 порта в server.xml