28 Stimmen

Tomcat kann nicht heruntergefahren werden

Wenn ich die folgenden Java-Optionen hinzufüge, um das Debugging zu aktivieren:

JAVA_OPTS="$JAVA_OPTS -noverify -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, den Tomcat herunterzufahren:

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)

36voto

Jaan Punkte 2090

Vielen Dank für die schöne kurze Erklärung, PHeath! Ihrem Rat folgend, habe ich herausgefunden, dass das Problem am besten zu lösen ist, indem ich einfach CATALINA_OPTS anstelle von JAVA_OPTS verwenden .

Ein Blick in catalina.sh zeigt, dass CATALINA_OPTS nur von den Befehlen "start" und "start-security" verwendet wird, während JAVA_OPTS auch vom Befehl "stop" verwendet wird (zumindest bei Tomcat 6.0.33 auf openSUSE 12.1).

Zumindest wenn Sie Tomcat unter Linux mit einem Paketmanager installiert haben, ist das Ändern der CATALINA_OPTS-Variable in /etc/tomcat6/tomcat6.conf (oder welchem Pfad auch immer in Ihrer Distribution) sauberer als das direkte Ändern des catalina.sh-Skripts, denn der Paketmanager geht davon aus, dass der Benutzer nur Konfigurationsdateien ändert, und ein Bruch dieser Annahme kann bei einem Upgrade der Tomcat-Pakete zu Problemen führen (z. B. verlorene Einstellungen, weil die catalina.sh-Datei überschrieben wird).

Ich denke, man sollte CATALINA_OPTS gegenüber JAVA_OPTS bevorzugen, nicht nur für JDWP, sondern auch für viele andere Optionen: z. B. wenn man die Heap-Size-Option -Xmx... verwendet, dann wäre es vernünftig, sie in CATALINA_OPTS unterzubringen, da der "stop"-Befehl nicht viel Heap benötigt.

0 Stimmen

Was ist Ihre Lösung, wenn Sie spring-boot (embedded tomcat) verwenden?

7voto

Dinusha Punkte 692

Das Problem ist, dass Ihr Tomcat immer noch auf dem Debug-Port (5005) oder einem anderen Dienst läuft, der auf demselben Port (5005) läuft.

Wenn Tomcat noch läuft, können Sie ihn beenden

  • wenn es sich um eine Linux-Umgebung handelt ps -ef|grep java und identifizieren Sie die Prozess-ID, und beenden Sie den Prozess mit sudo kill -9 .
  • Wenn es sich um eine Windows-Umgebung handelt, rufen Sie den Task-Manager auf und beenden Sie den Tomcat- und Java-Prozess.

Jetzt sollten Sie in der Lage sein, den Server ohne Probleme im Debug-Modus zu starten.

Dies kann beim Debuggen von Unit-Tests durch das Tool (Eclipse) passieren, die durch Maven ausgeführt wurden. Um dies zu lösen, können Sie den gleichen Prozess durchführen.

Schließen Sie zunächst Eclipse und beenden Sie auch den Java-Prozess und starten Sie ihn erneut.

4voto

Dies ist darauf zurückzuführen, dass beide Anwendungen im Debug-Modus dieselbe Portnummer, nämlich 8000, abhören.

Eine schnelle Lösung ist die Änderung des Debug-Ports auf 8001 in startup.bat

SET DEBUGPORT=8001

2voto

Mercer Traieste Punkte 4612

Es scheint, dass der Port 5005 bereits verwendet wird. Überprüfen Sie offene Ports mit netstat Befehl.

Dies kann daran liegen, dass Sie Tomcat bereits geöffnet haben. Überprüfen Sie Ihre Prozesse.

1voto

Gary Steven Punkte 156

Es scheint, dass Sie Tomcat mit aktiviertem Debugger starten, was die JVM dazu veranlasst, sich mit dem Prozess zum Debuggen zu verbinden. In catalina.sh gibt es jedoch eine Case-Anweisung für start, stop, restart usw. Das Ausführen des stop-Befehls fügt dies immer noch hinzu, da es Teil der globalen JAVA_OPTS ist und versucht, den Debugger zu starten, der auf demselben Port wie der shutdown-Befehl lauscht. Wenn Sie die Adresse=50005 aus Ihren JAVA_OPTS entfernen oder den Befehl start jdpa verwenden, um die VM mit dem Debugger zu starten, wird Ihr Problem behoben.

Sehen Sie sich die standardmäßige catalina.sh in der neuesten Tomcat-Distribution an, wenn Sie eine saubere Kopie benötigen. Es hört sich so an, als hätte jemand in Ihrer Datei Änderungen vorgenommen, die ungültig sind und dazu führen, dass JDPA beim Starten, Stoppen oder bei jedem beliebigen Befehl ausgeführt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X