Warum werden diese Java-Prozesse nicht beendet, sobald der Cronjob auf dem AIX-Server ausgeführt wurde?

Warum werden diese Java-Prozesse nicht beendet, sobald der Cronjob auf dem AIX-Server ausgeführt wurde?

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 einfach

    jcmd <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, stracedie von der App getätigten Systemaufrufe zu erfassen. Auch so erfahren Sie, was die App tut.

verwandte Informationen