У меня есть 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
на них, чтобы понять, что происходит.