![Warum werden diese Java-Prozesse nicht beendet, sobald der Cronjob auf dem AIX-Server ausgeführt wurde?](https://rvso.com/image/776326/Warum%20werden%20diese%20Java-Prozesse%20nicht%20beendet%2C%20sobald%20der%20Cronjob%20auf%20dem%20AIX-Server%20ausgef%C3%BChrt%20wurde%3F.png)
Ich habe eine Crontab eingerichtet, um alle 8 Stunden einen Java-Dienst im Betriebssystem AIX (7.1) auszuführen. Sobald die Crontab die Arbeit erledigt hat, sollte der JAVA-Dienst beendet werden. Dieser Cronjob funktioniert ordnungsgemäß. Aber der Java-Dienst hat seine Sitzung am Ende nicht geschlossen. Außerdem benötigt dieser Java-Dienst 3-4 Stunden, um die Dateien zu verarbeiten.
Die Zahl der Java-Sitzungen nimmt von Tag zu Tag zu und führt schließlich dazu, dass der Anwendungsserver in den Leerlauf gerät.
Java Version 1.8
AIX 7.1
Crontab-Eintrag:
00 8 * * * cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
Wenn ich die obige Anweisung manuell ausführe, wird der Cronjob ordnungsgemäß ausgeführt und die Sitzung wird am Ende geschlossen.
RUN.sh-Datei:
/usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
Unten sind die Java-Sitzungen aufgeführt, die noch auf dem Anwendungsserver ausgeführt werden. Bitte schauen Sie nach und sagen Sie mir, was ich falsch mache.
30932996 7340260 0 Mar 25 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
31129600 29425670 21 Mar 30 - 2953:54 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
32505878 33620190 25 08:00:00 - 216:49 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
32833638 40304674 25 Mar 28 - 4183:00 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
33620190 7340260 0 08:00:00 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
33947736 7340260 0 Apr 04 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
34406468 35389628 22 Apr 03 - 965:58 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
34471988 7340260 0 Mar 31 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
35389628 7340260 0 Apr 03 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
37290036 34471988 24 Mar 31 - 2444:53 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
38863052 7340260 0 Apr 02 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
39452824 30212288 30 Mar 26 - 5463:39 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
40304674 7340260 0 Mar 28 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
41484458 7340260 0 Apr 01 - 0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
43188280 23003326 27 Mar 22 - 8316:22 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46596146 20512790 29 Mar 27 - 4821:18 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46792934 27132138 26 Mar 24 - 6883:58 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46923976 30932996 26 Mar 25 - 6177:01 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
Ich weiß Ihre Zeit und Mühe in dieser Angelegenheit sehr zu schätzen.
Antwort1
Ich habe zunächst einen Kommentar abgegeben, denke aber, dass es sinnvoller wäre, eine richtige Antwort zu schreiben.
Als Erstes würde ich die Protokolle prüfen: Steht darin irgendetwas Sinnvolles run.log
? (Und vielleicht könnten Sie etwas an diese Datei anhängen, anstatt sie bei jeder Ausführung des Jobs zu überschreiben)
Überprüfen Sie dann den Benutzer/die Gruppe, unter der der Prozess ausgeführt wird. Ist es anders, wenn er von Cron ausgeführt wird, als wenn Sie ihn selbst ausführen?
Eine sehr nützliche Technik, um herauszufinden, wo eine Java/JVM-Anwendung festhängt, ist die Erstellung einesThread-Dump- Es gibt mehrere Möglichkeiten, dies zu tun:
mein Lieblingstool ist
jcmd
- du kannst einfachjcmd <pid> Thread.print > thread.$(date "+%F_%H-%M-%S").dump
eine andere schnelle Möglichkeit besteht darin, ein SIGQUIT-Signal zu senden:
kill -3 <pid>
- in diesem Fall wird der Thread-Dump auf die Standardausgabe des Prozesses gedruckt
Mit einem Thread-Dump können Sie die Anwendungs-Threads untersuchen und sehen, wo sie hängen.
Sie können auch versuchen, strace
die von der App getätigten Systemaufrufe zu erfassen. Auch so erfahren Sie, was die App tut.