Родительский процесс оболочки сервиса 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 была убита.

Другие вопросы по тегам