java服务包装父进程挂起

java服务包装父进程挂起,java,java-service-wrapper,tanuki,Java,Java Service Wrapper,Tanuki,我正在运行Tanuki包装器(已经运行了很长时间)。在生产中,它工作得很好,但在那几周里,我收到报告说包装进程(C代码)被挂起,不会死掉,这导致了生产问题 当我被提醒并查看时,我看到的是: 1) 几个小时前,子java进程被SIGKILL/9终止 STATUS | wrapper | 2016/02/08 03:49:20 | JVM收到信号SIGKILL(9)。 2) 然后,我看到我定制的内部监视程序进程发出了一个wrapper.sh stop来重置它,但它正在进入一个无限循环,如下所述: 3

我正在运行Tanuki包装器(已经运行了很长时间)。在生产中,它工作得很好,但在那几周里,我收到报告说包装进程(C代码)被挂起,不会死掉,这导致了生产问题

当我被提醒并查看时,我看到的是:

1) 几个小时前,子java进程被SIGKILL/9终止

STATUS | wrapper | 2016/02/08 03:49:20 | JVM收到信号SIGKILL(9)。

2) 然后,我看到我定制的内部监视程序进程发出了一个
wrapper.sh stop
来重置它,但它正在进入一个无限循环,如下所述:

3) 然后我登录到这个框中,找到包装器进程pid(记住JVM早就死了),并发出一个directkill$pid,然后等待。。。没什么

4) 最后放弃并发布kill-9$pid,最终杀死它,所有东西都清理干净并活着回来

问题:

如果kill$pid(SIGTERM/15)不起作用,我如何对应用程序进行故障排除?多年来,这种方法一直很有效,在许多其他过程中仍然存在,但只有少数过程失败了

当然,关于Tanuki的大多数问题和文档都是关于如何操作/询问子JVM的,但是我实际上看到了一个问题,我假设是C代码,我不确定如何询问挂起的PID以使C代码放弃秘密。也许
/proc/$pid
中的某些内容可以告诉我它挂起了什么


帮助我欧比-万·克诺比,你我唯一的希望…

塔努基软件公司的莱夫

JVM被SIGKILL意外终止的最可能原因是操作系统资源不足,导致进程终止。当这种情况发生时,Java通常是内存的最大用户,因此它会被钉住。请检查系统日志,如果这是原因,那么应该同时有一个条目

然而,即使发生这种情况,包装器也应该正确地处理这种情况并重新启动JVM。听起来好像包装器自己进入了一个意外的状态,并且本身没有对正常信号做出响应。 您正在使用的包装器的版本是什么? 我仔细检查了发行说明,但认为我们以前没有看到过这个确切的问题。


请让我知道JVM被杀死时您在系统日志中发现了什么。

来自Tanuki软件的Leif

JVM被SIGKILL意外终止的最可能原因是操作系统资源不足,导致进程终止。当这种情况发生时,Java通常是内存的最大用户,因此它会被钉住。请检查系统日志,如果这是原因,那么应该同时有一个条目

然而,即使发生这种情况,包装器也应该正确地处理这种情况并重新启动JVM。听起来好像包装器自己进入了一个意外的状态,并且本身没有对正常信号做出响应。 您正在使用的包装器的版本是什么? 我仔细检查了发行说明,但认为我们以前没有看到过这个确切的问题。


请告诉我JVM被杀死时您在系统日志中发现了什么。

Leif-非常感谢您的回复。据我所知,我们使用的是一个非常旧的版本。3.3.6. 用信号1,2,3,15杀死没有任何影响。当我发送USR1 Sig 30和16时,它杀死了悬挂包装器pid。包装器二进制文件的MD5是5bdffe43a2a3e4ab4afc0276133884f3以验证版本。现在这种情况大约每天发生一次,所以我有很多机会去测试:D多年来,这种方法一直很有效,所以我试着看看环境的各个部分。还有什么要检查的吗?lsof也没用。我试着格式化这个,但对我不好:对不起<代码>错误|包装器| 2016/02/10 13:01:11 | JVM出现挂起:等待JVM的信号超时。错误| wrapper | 2016/02/10 13:01:11 | JVM未根据请求退出,终止状态| wrapper | 2016/02/10 13:01:12 | JVM收到信号SIGKILL(9)。Leif-非常感谢您再次联系我们。据我所知,我们使用的是一个非常旧的版本。3.3.6. 用信号1,2,3,15杀死没有任何影响。当我发送USR1 Sig 30和16时,它杀死了悬挂包装器pid。包装器二进制文件的MD5是5bdffe43a2a3e4ab4afc0276133884f3以验证版本。现在这种情况大约每天发生一次,所以我有很多机会去测试:D多年来,这种方法一直很有效,所以我试着看看环境的各个部分。还有什么要检查的吗?lsof也没用。我试着格式化这个,但对我不好:对不起<代码>错误|包装器| 2016/02/10 13:01:11 | JVM出现挂起:等待JVM的信号超时。错误| wrapper | 2016/02/10 13:01:11 | JVM未根据请求退出,终止状态| wrapper | 2016/02/10 13:01:12 | JVM收到信号SIGKILL(9)。
stopit() {
    [snip]
            kill $pid  
            [snip]

        # MY NOTE It never gets out of this, the kill doesn't work

        # We can not predict how long it will take for the wrapper to
        #  actually stop as it depends on settings in wrapper.conf.
        #  Loop until it does.
        savepid=$pid
        CNT=0
        TOTCNT=0
        while [ "X$pid" != "X" ]
        do
            # Show a waiting message every 5 seconds.
            if [ "$CNT" -lt "5" ]
            then
                CNT=`expr $CNT + 1`
            else
                eval echo `gettext 'Waiting for $APP_LONG_NAME to exit...'`
                CNT=0
            fi
            TOTCNT=`expr $TOTCNT + 1`

            sleep 1

            testpid
        done

      [ SNIP ] 
    fi
}