我正在运行Tanuki Wrapper(并且已经持续了很长时间)。在生产中,它工作的很好,但是在那几个星期里,我得到报告说封装器进程(C代码)被挂起并且不会死,这会导致生产问题。
当我收到警报,我看看这里是我所看到的:
1)子元素java程序在几个小时前被SIGKILL / 9杀死
STATUS | wrapper | 2016/02/08 03:49:20 | JVM received a signal SIGKILL (9).
2)然后,我看到一个wrapper.sh stop问题是由我自定义的内部观察器进程重置它的,但是这将进入一个无限循环,如下所述:code link
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
}3)然后我登录到盒子并找到包装进程pid(记住JVM已经很长时间了),并发出一个直接kill $ pid,然后等待......什么也不做。 possible code?
4)最后放弃并发行kill -9 $ pid,并最终杀死它,并且一切都清理干净并恢复活力。
问题:
如何解决kill $ pid(SIGTERM / 15)不起作用的问题?这对于YEARS非常有效,并且仍然处于其他许多过程中,但仅有少数失败。
当然,关于Tanuki的大多数问题和文档都是关于如何操作/询问子JVM,但是我实际上看到了一个我认为是C代码的问题,而且我不确定如何询问挂起的PID C代码放弃秘密。也许/proc/$pid中的某些东西可以告诉我它挂在了什么上面?
帮助我Obi-Wan Kenobi,你唯一的希望