Tomcat hört nicht auf. Wie kann ich das debuggen?
Ich habe eine Tomcat 7
läuft auf Linux, ich starte über $CATALINA_HOME/bin/startup.sh
- und Herunterfahren über $CATALINA_HOME/bin/shutdown.sh
von /etc/init.d
Alles ok ist, außer 1 problem. Manchmal tomcat ist nicht zu stoppen.
Obwohl ich es beenden und ich sehe in catalina.aus Protokollen, die den Bach runter geht, wenn ich ps -ef
ich noch sehen können, der Prozess läuft.
Was das problem sein könnte? Wie kann ich Debuggen? Mein Gefühl ist, dass dieses mit threads.
Also die Teile, die verdächtig sind, sind die folgenden:
1) ich benutze Log4j ist LogManager zu erkennen, ob die log4j-Konfiguration geändert wurde, aber ich Log4jManager.shutdown
auf eine contextDestroyed
ServletContextListener
2) ich benutze H2
Datenbank und ich sehe auf shutdown:
SCHWERER: Die web-Anwendung [/MyApplication] scheint begonnen zu haben, ein
thread namens [H2 Log-Writer MYAPPLICATION] aber hat es versäumt, ihn zu stoppen.
Dies wird sehr wahrscheinlich einen SpeicherverlustSCHWERER: Die web-Anwendung [/MyApplication] scheint begonnen zu haben, ein
thread namens [H2 Datei-Lock-Watchdog
/opt/myOrg/tomcat/webapps/MyApplication/db/myDatabase.lock.db] aber hat
versäumt, ihn zu stoppen. Dies wird sehr wahrscheinlich einen Speicherverlust. Apr 2,
2012 9:08:08 AM org.apache.catalina.loader.WebappClassLoader
clearReferencesThreads SCHWERER: Die web-Anwendung [/MyApplication]
scheint begonnen zu haben einen thread namens " [FileWatchdog] aber hat es versäumt
um es zu stoppen. Dies wird sehr wahrscheinlich einen Speicherverlust.
Jede Hilfe bitte? Wie kann ich erkennen das problem hier?
UPDATE:
Ich habe eine kill -3
wie vorgeschlagen von @daveb, und in der catalina.ich sehe:
JVMDUMP006I Verarbeitung dump-Ereignis "Benutzer", " detail "" - bitte warten.
JVMDUMP032I JVM angefordert Java-dump mit
'/etc/init.d/javacore.20120402.093922.2568.0001.txt' in Reaktion auf ein
Veranstaltung JVMDUMP010I Java dump geschrieben
/etc/init.d/javacore.20120402.093922.2568.0001.txt JVMDUMP013I
Verarbeitet dump-Ereignis "Benutzer", " detail "".
Es ist ein javacore in /etc/init.d
aber ich weiß nicht, wie Sie zu verarbeiten. I. e. welche Teile sollte ich untersuchen
InformationsquelleAutor der Frage Jim | 2012-04-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die web-Anwendung beendet wird, werden alle verbindungen zur Datenbank geschlossen werden soll auch. Wenn Sie nicht über eine Liste der verbindungen, dann die SQL-Anweisung ausführen "shutdown" (dies funktioniert nur für die H2 und HSQLDB-Datenbanken).
Wenn Sie sich registriert haben ein Servlet, das Sie tun können, dass in der
Servlet.destroy()
Methode.Wenn Sie sich registriert haben, ein
ServletContextListener
auszuführen, können Sie den "shutdown" - Anweisung in derServletContextListener.contextDestroyed(ServletContextEvent servletContextEvent)
Methode. Dies ist, wasorg.h2.server.web.DbStarter
ServletContextListener
tut (die eine, die enthalten ist in der H2-Datenbank).InformationsquelleAutor der Antwort Thomas Mueller
Finden Sie heraus, was threads sind noch aktiv (oder gesperrt ist, warten, um zu laufen) durch die Verwendung von jstack oder senden ein signal an den Prozess:
Wenn Sie dies wissen, Sie können machen, was immer es war, begann Sie Haken in die shutdown-Meldung zum stoppen der threads. Oder machen die threads Dämon-threads.
Sehen Diese tomcat shutdown Frage für weitere details.
Wenn Sie nicht wissen, wo Ihr die threads erstellt wurden, dann betrachten Sie das hinzufügen von Namen zu Ihnen - Vollzieher nehmen können thread-Fabriken, und Sie können mit diesen Fabriken zu setzen, der Dämon status eines Threads, und auch einen Namen - so Ihr stack-trace wird deutlicher.
InformationsquelleAutor der Antwort daveb
Überprüfen Sie, ob Ihre Web-Anwendung hat einige Scheduler aktiv, wie Quarz.
Wenn Sie don ' T stop it, Web-Application-Thread niemals enden, bis Sie es töten
InformationsquelleAutor der Antwort Marco
Ich hatte genau das gleiche problem. Manchmal, den Befehl
./shutdown.sh
nicht stoppen Sie den tomcat-Prozess, und seinejava
- Prozess bleibt in den Laufenden Prozessen.Hatte ich dieses problem mit dem Tomcat-version in den Ubuntu software-repositories, von:
Nach der Installation aus den Paket-manager und konfigurieren Sie einige Einstellungen, ich habe keine Probleme beim stoppen/starten von Tomcat. Ich benutzte diesen Befehl zu stoppen, und es nie versäumt:
das ist fast das gleiche wie
Mit diesem Befehl wird der code-block aus dem init-Skript, speziell die codes aus der Datei
/etc/init.d/tomcat7
. Also schaute ich hinein, um zu sehen, was es für immer töten, der tomcat-Prozess erfolgreich. Hier ist der code-block, der ausgeführt wird, wenn Sie verwendenservice tomcat7 stop
Befehl:Der wichtigste Teil ist dieser:
Bedeutet "Wiederholung zu stoppen, bis der Prozess beendet wird. Hier ist der --Befehl wiederholen Dokumentation von start-stop-daemon Handbuch:
So,
--retry=TERM/20/KILL/5
bedeutet "Senden BEGRIFF signal an den Prozess, warten Sie 20 Sekunden, wenn es noch läuft, senden TÖTEN signal, warten Sie 5 Sekunden, wenn es immer noch läuft, gibt es ein problem.Bedeutet dies, können Sie konfigurieren Sie die tomcat zu laufen wie ein Dämon und einen Befehl wie diesen verwenden, oder schreiben Sie ein Skript, das zu tun diese Art von Aktion zu stoppen Sie tomcat, oder einfach nur Ubuntu und Holen Sie sich die tomcat aus dem Paket-manager.
InformationsquelleAutor der Antwort Utku Özdemir
In meinem Fall hatte ich eine unseriöse JPA EntityManager, das war nicht richtig geschlossen, nach dem Gebrauch. Behoben,, und jetzt kann ich die Reinigen-und-wieder Bauen, ohne zu töten das verdammte Java-Prozess, der jedes mal 🙂
InformationsquelleAutor der Antwort JohannSig
Ich hatte auch das gleiche problem. Es war ein ThrottledThreadPoolExecutor in meiner Anwendung, dass war nicht immer Herunterfahren. Wenn ich ihn Herunterfahren richtig, tomcat stoppen würde sauber. Um herauszufinden, das problem, das ich hatte, zu entfernen alle apps von meinem tomcat
webapps
- Verzeichnis und fügen Sie Sie eins nach dem anderen und sehen, welche war das problem verursachtInformationsquelleAutor der Antwort Denorm
Wenn Sie einen Scheduler oder eine andere Person in Ihrem web-app, müssen Sie es Herunterfahren. In der Regel müssen Sie einen ServletContextListener um die Haken, um Ihren shutdown-Aufruf. Ein shutdown-hook funktioniert nicht in diesem Fall, weil die JVM nicht Herunterfahren (noch) nicht. Glauben Sie mir, ich habe versucht. Wenn Ihr code ist in der agent-code oder etwas, das außerhalb des Behälters/webapp, dann ein shutdown-hook funktionieren SOLLTE, obwohl es oft an den Haaren ziehen Erfahrung, um herauszufinden, warum es immer NOCH nicht funktioniert. Beachten Sie, ich bin kahl.
InformationsquelleAutor der Antwort ticktock