Родительский процесс оболочки сервиса java завис
Я работаю с 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
У меня были проблемы с моим встроенным процессом внутреннего наблюдателя, чтобы сбросить его, но это входит в бесконечный цикл, как описано ниже: ссылка на код
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 kill pid, и жду... ничего. возможный код?
4) В конце концов сдаться и выдать kill -9 $pid, и это, наконец, убивает его, и все очищается и возвращается живым.
ВОПРОСЫ:
Как мне сработать, если приложение kill $pid (SIGTERM/15) не работает? Это работало отлично для ГОДОВ и все еще на многих других процессах, но только на нескольких он терпит неудачу.
Конечно, большинство вопросов и документации на Tanuki касаются того, как манипулировать / опрашивать дочернюю JVM, но на самом деле я вижу проблему с тем, что, как я предполагаю, является кодом C, и я не уверен, как запросить зависший PID для код C, чтобы отказаться от секретов. Может быть, что-то в /proc/$pid
можете подсказать на чем это повешено?
Помоги мне, Оби-Ван Кеноби, твоя единственная надежда...
1 ответ
Лейф от Tanuki Software
Наиболее вероятной причиной неожиданного уничтожения JVM с помощью SIGKILL является то, что в ОС не хватает ресурсов, и процесс был остановлен. Когда это происходит, Java часто является самым большим пользователем памяти, так что она получает прибой. Пожалуйста, проверьте системный журнал, поскольку в то же время должна быть запись, если это является причиной.
Однако даже если это произойдет, Оболочка должна обработать это правильно и перезапустить вашу JVM. Похоже, что Оболочка попала в неожиданное состояние и не реагирует на обычные сигналы сама. Какую версию Wrapper вы используете? Я дважды проверил примечания к выпуску, но не думаю, что мы видели эту проблему раньше. http://wrapper.tanukisoftware.com/doc/english/release-notes.html
Пожалуйста, дайте мне знать, что вы найдете в своем системном журнале, когда JVM была убита.