cronjob调用后Java程序不会关闭

时间:2012-09-11 19:20:33

标签: java cron javamail

我编写了一个Java程序,用于从我的邮件帐户中检索邮件。

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

的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? Sl 0:59 java -jar /path/to/file.jar

我的Java程序就是这样的:

  1. 主要是我调用构造函数
  2. 在构造函数中,我调用了使用javax.mail。*
  3. 获取邮件的Method
  4. 然后程序结束了......至少它应该是
  5. 有谁知道为什么程序不退出?请帮忙。

    编辑:

    在日志文件中我发现了这个:

    “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.
    

3 个答案:

答案 0 :(得分:3)

执行线程转储以找出仍在运行的内容:如果您使用的是Oracle JVM,则可以使用jstack PID。

答案 1 :(得分:1)

在程序的最后放置调试打印。 如果看到打印,则表示主线程结束,但程序不会退出。我猜测JavaMail有一个线程保持打开(可能是一个邮件会话),需要关闭。你确定在退出之前关闭所有资源吗?

答案 2 :(得分:0)

尝试在作业完成时显式使用JVM。这是执行此操作的代码:

System.exit(0);

正如iccthedral所说,也许有一些代码阻止了你的程序。