Назад | Перейти на главную страницу

Фантомное убийство процесса

У меня есть Java-приложение, работающее на сервере CentOS 5.4.

Случайным образом и, казалось бы, без причины, эти процессы умирают не из-за выхода приложения или из-за того, что я его убил, а из-за чего-то, что убивает, не оставляя следов.

Я регистрирую весь вывод приложения, а также отправляю stderr и stdout в файл журнала, и ни один из этих журналов вывода не содержит ничего, что могло бы указать, почему эти процессы умерли.

Моим первым инстинктом было убийство OOM на уровне ядра, но в системе никогда не бывает нехватки памяти, и в любой момент времени она обычно имеет от 1 до 3 ГБ свободной памяти.

Мой вопрос: кто-нибудь знает, что может быть причиной этого, или у кого-нибудь есть идеи, где я мог бы начать искать?

Спасибо.

Запуск моего Java-приложения с

strace -tt -o strace.out <java command>

Показал, что ему отправляли команду SIGHUP, которая его убивала. Оказалось, что, хотя я настраивал процесс для работы в фоновом режиме (добавляя & к команде), команда по-прежнему привязана к тому потоку, который ее создал.

Это означало, что для команд, выполняемых apache, они будут уничтожаться всякий раз, когда рабочий поток, создавший их, перезапускался, а для команд, выполняемых вручную, они уничтожались всякий раз, когда я выходил из системы.

Я исправил это, просто отложив nohup к команде, т.е.

nohup java -jar /path/to/my/java.jar arguments &

Процессы могут получать некоторый сигнал, который заставляет их завершиться, возможно, из-за плохого оборудования (например, плохая память может вызвать сбои в сегменте). Если вы ничего не видите, syslog / dmesg попробуйте включить дампы ядра. Затем вы можете запустить gdb на них, чтобы понять, что происходит.