Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序不';cronjob呼叫后无法关闭_Java_Cron_Jakarta Mail - Fatal编程技术网

Java程序不';cronjob呼叫后无法关闭

Java程序不';cronjob呼叫后无法关闭,java,cron,jakarta-mail,Java,Cron,Jakarta Mail,我已经编写了一个Java程序,可以从我的邮件帐户中检索邮件 Ubuntu服务器上的cronjob每隔15分钟调用一次这个jar cronjob: /bin/sh/root/scripte/cron_bugtracker.sh cron_bugtracker.sh: java-jar/path/to/file.jar jar工作正常,但程序无法退出 当我执行ps ax | grep java时,它总是以java-jar/path/to/file.jar作为命令显示许多java进程: 32208?S

我已经编写了一个Java程序,可以从我的邮件帐户中检索邮件

Ubuntu服务器上的cronjob每隔15分钟调用一次这个jar

cronjob:

/bin/sh/root/scripte/cron_bugtracker.sh

cron_bugtracker.sh:

java-jar/path/to/file.jar

jar工作正常,但程序无法退出

当我执行
ps ax | grep java
时,它总是以
java-jar/path/to/file.jar
作为命令显示许多java进程:

32208?SL0:59 java-jar/path/to/file.jar

我的Java程序是这样工作的:

  • 我主要调用构造函数
  • 在构造函数中,我使用javax.mail调用获取邮件的方法*
  • 然后程序就完成了……至少应该是这样
  • 有人知道程序为什么不退出吗?请帮忙

    编辑:

    在日志文件中,我发现:

    “Control”是我的主类的名称

    Full thread dump Java HotSpot(TM) Client VM (23.1-b03 mixed mode):
    
    "Service Thread" daemon prio=10 tid=0xb76bd000 nid=0x292 runnable [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "C1 CompilerThread0" daemon prio=10 tid=0xb76bb400 nid=0x291 waiting on condition [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "Signal Dispatcher" daemon prio=10 tid=0xb76b9800 nid=0x290 waiting on condition [0x00000000]
       java.lang.Thread.State: RUNNABLE
    
    "Finalizer" daemon prio=10 tid=0xb7681c00 nid=0x28f in Object.wait() [0xa10ad000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0xa1585650> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(Unknown Source)
            - locked <0xa1585650> (a java.lang.ref.ReferenceQueue$Lock)
            at java.lang.ref.ReferenceQueue.remove(Unknown Source)
            at java.lang.ref.Finalizer$FinalizerThread.run(Unknown Source)
    
    "Reference Handler" daemon prio=10 tid=0xb7680000 nid=0x28e in Object.wait() [0xa10fe000]
       java.lang.Thread.State: WAITING (on object monitor)
            at java.lang.Object.wait(Native Method)
            - waiting on <0xa1585228> (a java.lang.ref.Reference$Lock)
            at java.lang.Object.wait(Object.java:503)
            at java.lang.ref.Reference$ReferenceHandler.run(Unknown Source)
            - locked <0xa1585228> (a java.lang.ref.Reference$Lock)
    
    "main" prio=10 tid=0xb7606000 nid=0x28c runnable [0xb77ae000]
       java.lang.Thread.State: RUNNABLE
    
            at java.lang.ClassLoader.findBootstrapClass(Native Method)
            at java.lang.ClassLoader.findBootstrapClassOrNull(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            - locked <0xa1855398> (a java.lang.Object)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at com.sun.mail.pop3.POP3Folder.createMessage(POP3Folder.java:362)
            at com.sun.mail.pop3.POP3Folder.getMessage(POP3Folder.java:343)
            - locked <0xa18261a0> (a com.sun.mail.pop3.POP3Folder)
            at javax.mail.Folder.getMessages(Folder.java:947)
            - locked <0xa18261a0> (a com.sun.mail.pop3.POP3Folder)
            at javax.mail.Folder.search(Folder.java:1231)
            at Control.receive(Control.java:53)
            at Control.<init>(Control.java:29)
            at Control.main(Control.java:24)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
    
    "VM Thread" prio=10 tid=0xb767a800 nid=0x28d runnable
    
    "VM Periodic Task Thread" prio=10 tid=0xb76bf800 nid=0x293 waiting on condition
    
    JNI global references: 163
    
    Heap
     def new generation   total 4928K, used 2907K [0xa1580000, 0xa1ad0000, 0xa6ad0000)
      eden space 4416K,  65% used [0xa1580000, 0xa1856e20, 0xa19d0000)
      from space 512K,   0% used [0xa19d0000, 0xa19d0000, 0xa1a50000)
      to   space 512K,   0% used [0xa1a50000, 0xa1a50000, 0xa1ad0000)
     tenured generation   total 10944K, used 0K [0xa6ad0000, 0xa7580000, 0xb1580000)
       the space 10944K,   0% used [0xa6ad0000, 0xa6ad0000, 0xa6ad0200, 0xa7580000)
     compacting perm gen  total 12288K, used 2688K [0xb1580000, 0xb2180000, 0xb5580000)
       the space 12288K,  21% used [0xb1580000, 0xb1820230, 0xb1820400, 0xb2180000)
    No shared spaces configured.
    
    全线程转储Java热点(TM)客户端VM(23.1-b03混合模式):
    “服务线程”守护进程prio=10 tid=0xb76bd000 nid=0x292可运行[0x00000000]
    java.lang.Thread.State:可运行
    “C1编译器线程0”守护程序prio=10 tid=0xb76bb400 nid=0x291等待条件[0x00000000]
    java.lang.Thread.State:可运行
    “信号调度器”守护程序prio=10 tid=0xb76b9800 nid=0x290等待条件[0x00000000]
    java.lang.Thread.State:可运行
    Object.wait()中的“Finalizer”守护程序prio=10 tid=0xb7681c00 nid=0x28f[0xa10ad000]
    java.lang.Thread.State:正在等待(在对象监视器上)
    在java.lang.Object.wait(本机方法)
    -等待(java.lang.ref.ReferenceQueue$Lock)
    位于java.lang.ref.ReferenceQueue.remove(未知源)
    -锁定(java.lang.ref.ReferenceQueue$Lock)
    位于java.lang.ref.ReferenceQueue.remove(未知源)
    位于java.lang.ref.Finalizer$FinalizerThread.run(未知源)
    对象中的“引用处理程序”守护程序prio=10 tid=0xb7680000 nid=0x28e.wait()[0xa10fe000]
    java.lang.Thread.State:正在等待(在对象监视器上)
    在java.lang.Object.wait(本机方法)
    -等待(java.lang.ref.Reference$Lock)
    等待(Object.java:503)
    位于java.lang.ref.Reference$ReferenceHandler.run(未知源)
    -锁定(一个java.lang.ref.Reference$Lock)
    “主”优先级=10 tid=0xb7606000 nid=0x28c可运行[0xb77ae000]
    java.lang.Thread.State:可运行
    位于java.lang.ClassLoader.findBootstrapClass(本机方法)
    位于java.lang.ClassLoader.findBootstrapClassOrNull(未知源)
    位于java.lang.ClassLoader.loadClass(未知源)
    -锁定(一个java.lang.Object)
    位于java.lang.ClassLoader.loadClass(未知源)
    位于com.sun.mail.pop3.POP3Folder.createMessage(POP3Folder.java:362)
    位于com.sun.mail.pop3.POP3Folder.getMessage(POP3Folder.java:343)
    -锁定(com.sun.mail.pop3.pop3文件夹)
    在javax.mail.Folder.getMessages(Folder.java:947)
    -锁定(com.sun.mail.pop3.pop3文件夹)
    在javax.mail.Folder.search(Folder.java:1231)
    at Control.receive(Control.java:53)
    at Control.(Control.java:29)
    at Control.main(Control.java:24)
    在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
    位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
    在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
    位于java.lang.reflect.Method.invoke(未知源)
    位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
    “VM线程”优先级=10 tid=0xb767a800 nid=0x28d可运行
    “VM定期任务线程”优先级=10 tid=0xb76bf800 nid=0x293等待状态
    JNI全球参考文献:163
    堆
    def新一代总计4928K,已使用2907K[0xa1580000、0xa1ad0000、0xa6ad0000)
    eden空间4416K,65%已使用[0xa1580000,0xa1856e20,0xa19d0000)
    从空间512K开始,0%已使用[0xa19d0000、0xa19d0000、0xa1a50000)
    对于空间512K,使用了0%[0xa1a50000,0xa1a50000,0xa1ad0000)
    终身发电总量10944K,使用量为0K[0xa6ad0000、0xa7580000、0xb1580000)
    空间10944K,已使用0%[0xa6ad0000、0xa6ad0000、0xa6ad0200、0xa7580000)
    总压实量12288K,使用量2688K[0xb1580000、0xb2180000、0xb5580000)
    空间12288K,已使用21%[0xb1580000、0xb1820230、0xb1820400、0xb2180000)
    没有配置共享空间。
    
    在作业完成时,尝试使用显式完成JVM。这是执行此操作的代码:

    System.exit(0);
    

    正如iccthedral所说,可能有一些代码阻塞了您的程序。

    在程序的最后添加调试打印。
    如果您看到打印,那么这意味着主线程结束,但程序没有退出,这需要关闭。您确定要在退出之前关闭所有资源吗?

    进行线程转储,以了解仍在运行的内容:如果您使用的是Oracle JVM,您可以使用jstack PID进行此操作。

    如果您可以继续并隔离阻塞的代码段……那将非常好,是的。也许可以进行一些登录,看看代码在哪里如果你自己启动你的java程序,它会按照预期运行?我想他已经很清楚挂起的地方了。他提到程序没有退出;他没有提到程序没有做它应该做的事情。事实上,他说程序工作正常(“jar工作正常,但程序没有退出”)@ilmiacs:如果我用eclipse启动它,它会工作得很好。因为这会阻碍潜在的资源泄漏。我不会急于明确退出JVM,作为未知挂起的解决方法。+1,因为查看OP的假设是否正确会很有用,但Isaac是对的-这无助于检测问题的根源。一个好的ans我们将是你两个答案的组合(TMHO)。我认识一些人。谢谢你的建议!+1-好主意!这是通过:
    $JAVA_HOME/bin/jsta完成的